在JavaScript中使用递归展平嵌套数组

use*_*121 5 javascript recursion

我试图在保留顺序的同时展平嵌套数组,例如[[1, 2], 3, [4, [[5]]]]应该转换为[1, 2, 3, 4, 5].

我正在尝试使用递归来执行此操作,但下面的代码不起作用,我不明白为什么.我知道还有其他方法可以做到这一点,但我想知道这有什么问题.

function flatten (arr) {
  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      flatten(arr);
    } else {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}

flatten([[1, 2], 3, [4, [[5]]]]);
Run Code Online (Sandbox Code Playgroud)

谢谢

Ore*_*enD 12

flatten递归调用时,您需要传递arr[i]给它,然后使用newArr连接结果.所以替换这一行:

flatten(arr);
Run Code Online (Sandbox Code Playgroud)

有:

newArr = newArr.concat(flatten(arr[i]));
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我经常用于展平嵌套数组的常见模式,由于其函数式编程性质,我发现它更加干净:

var flatten = (arrayOfArrays) =>
    arrayOfArrays.reduce((flattened, item) =>
        flattened.concat(Array.isArray(item) ? flatten(item) : [item]), []);
Run Code Online (Sandbox Code Playgroud)

或者对于那些喜欢更短、可读性较差的代码高尔夫版本的人来说:

var flatten=a=>a.reduce((f,i)=>f.concat(Array.isArray(i)?flatten(i):[i]),[]);
Run Code Online (Sandbox Code Playgroud)