Algorithm steamroller - thelastmile/FreeCodeCamp GitHub Wiki
🚩 Remember to use Read-Search-Ask
if you get stuck. Try to pair program 👥 and write your own code 📝
This problem seems simple but you need to make sure to flatten any array, regardless of the level which is what adds a bit of difficulty to the problem.
You need to check if an element is an array or not.
try to solve the problem now
If you are dealing with an array, then you need flatten it by getting the value inside of the array. This means if you have 4 then instead of returning [4] you need to return 4. If you get [4] then the same, you want the 4. You can access it with arr[index1][index2] to go a level deeper.
try to solve the problem now
You will definitely need recursion or another way to go beyond two level arrays to make the code flexible and not hard-coded to the answers needed. Have fun!
try to solve the problem now
Solution ahead!
function steamrollArray(arr) {
var flattenedArray = [];
// Create function that adds an element if it is not an array.
// If it is an array, then loops through it and uses recursion on that array.
var flatten = function(arg) {
if (!Array.isArray(arg)) {
flattenedArray.push(arg);
} else {
for (var a in arg) {
flatten(arg[a]);
}
}
};
// Call the function for each element in the array
arr.forEach(flatten);
return flattenedArray;
}
// test here
steamrollArray([1, [2], [3, [[4]]]]);
🚀 Run Code
- Create a new variable to keep flattened arrays.
- Create a function that will add non array elements to the new variable, and for the ones that are array it loops through them to get the element.
- It does that by using recursion, if the element is an array then call the function again with a layer of array deeper to check if it is an array or not. if it is not then push that non-array element to the variable that gets returned. Otherwise, keep going deeper.
- Invoke the function, the first time you will always pass it an array, so it always fall in to the isArray branch
- Return the flattened array.
function steamrollArray(arr) {
return arr.reduce(function (flat, toFlatten) {
return flat.concat(Array.isArray(toFlatten) ? steamrollArray(toFlatten) : toFlatten);
}, []);
}
// test here
steamrollArray([1, [2], [3, [[4]]]]);
🚀 Run Code
- Use reduce to concatenate each element into the last element
- If the new element is an Array itself call the function recursively to flatten it before merging it with the rest of result
- Pass an empty array to reduce as initial value to make sure even the first element will be processed
- Credit goes to
If you found this page useful, you may say thanks to the contributors by copying and pasting the following line in the main chat:
Thanks @Rafase282 for your help with Algorithm: Steamroller
⚠️ DO NOT add solutions that are similar to any existing solutions. If you think it is similar but better, then try to merge (or replace) the existing similar solution.- Add an explanation of your solution.
- Categorize the solution in one of the following categories — Basic, Intermediate and Advanced. 🚥
- Please add your username only if you have added any relevant main contents. (:warning: DO NOT remove any existing usernames)
See 👉
Wiki Challenge Solution Template
for reference.