Search code examples
javascriptrecursion

flatten an array recursively


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.


Solution

  • 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