I tried to implement an array flatten function recursively. Here is the code:
function flatten(arr) { var flatArr = []; for (var i = 0; i < arr.length; i++) { if (arr[i] instanceof Array) { flatArr.concat(flatten(arr[i])); } else { flatArr.push(arr[i]); } } return flatArr; } console.log(flatten([1, 2, 3, 4, [5]])); /* result: [1, 2, 3, 4] expected: [1, 2, 3, 4, 5] */
But I don’t know why the result is not correct. Please help me explain it.
Advertisement
Answer
The
concat()
method returns a new array comprised of the array on which it is called joined with the array(s) and/or value(s) provided as arguments.
flatArr.concat(...)
doesn’t change flatArr
… you need to assign it like so:
flatArr = flatArr.concat('flatten(arr[i]));
Here is a working example with 3 levels deep array:
function flatten(arr) { var flatArr = []; for (var i = 0; i < arr.length; i++) { if (arr[i] instanceof Array) { flatArr = flatArr.concat(flatten(arr[i])); } else { flatArr.push(arr[i]); } } return flatArr; } var arr = [1,2,3,4,[5,6,[7,8]]]; var flatten = flatten(arr); $('#result').html(JSON.stringify(flatten));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="result"></div>
You can read more about Array.concat function here