压平锯齿状的多维阵列

时间:2016-07-31 17:16:00

标签: javascript multidimensional-array

我需要帮助展平这样的数组:

[1,2,2,3,5,6,1,4,7].

我希望它像

[].concat.apply

我搜索过这样的东西,发现{{1}},但它只会处理二维数组。

我还想使用一种适用于任何锯齿状多维数组的算法。请帮忙。 THX

2 个答案:

答案 0 :(得分:1)

您可以将concat.apply事物包装在循环中以处理深层嵌套数组:

while (a.some(Array.isArray))
    a = [].concat.apply([], a)

或ES6语法:

while (a.some(Array.isArray)) 
    a = [].concat(...a);

答案 1 :(得分:0)

我的建议是依赖lodash并使用flattenDeep功能。

_.flattenDeep([1,2,[2,3],[5,[6,1],4],7])
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]

如果你想编写自己的函数,你可能想要查看lodash实现。

在伪代码中,这是一种递归方法:

result = []
function flatten(array)
  for each element in array
    if element is array
      flatten(element)
    else
      result.append(element)

修改

这是一种“手工”的方法,但我绝对建议依靠经过更好测试的lodash实现。

function flatten(arr, result) {
  if (result === undefined) {
    result = [];
  }

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

  return result;
}

console.log(flatten([1, 2, [2, 3], [5, [6, 1], 4], 7]));

// Output:
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]