如何在javascript中展平嵌套数组?

31 浏览
0 Comments

如何在javascript中展平嵌套数组?

此问题已经有答案了:

将一个由数组组成的数组合并/扁平化

我们知道,通过使用 reduce() 方法可以将数组 [[0, 1], [2, 3], [4, 5]] 扁平化。

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
  return a.concat(b);
});

那么如何将数组 [[[0], [1]], [[2], [3]], [[4], [5]]] 扁平化为 [0, 1, 2, 3, 4, 5] 呢?

admin 更改状态以发布 2023年5月20日
0
0 Comments

使用递归的ES6样式:

Redacted


2018年6月更新:

现在有一个ES提案,针对Array.prototype.flat方法。它当前处于stage 3,意味着它很可能很快被浏览器实现并以其当前形式进入规范。可能有一些Polyfills在流传。

例子:

const nested = [[[0], [1]], [[2], [3]], [[4], [5]]];
const flattened = nested.flat(2);  // Need to specify depth if > 1

2019年6月更新:

Array.prototype.flat已正式添加到ES2019规范中。

0
0 Comments

递归的使用场景很完美,它甚至可以处理更深的结构:

function flatten(ary) {
    var ret = [];
    for(var i = 0; i < ary.length; i++) {
        if(Array.isArray(ary[i])) {
            ret = ret.concat(flatten(ary[i]));
        } else {
            ret.push(ary[i]);
        }
    }
    return ret;
}
flatten([[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]]) // [0, 1, 2, 3, 4, 5]

或者作为数组的方法:

Array.prototype.flatten = function() {
    var ret = [];
    for(var i = 0; i < this.length; i++) {
        if(Array.isArray(this[i])) {
            ret = ret.concat(this[i].flatten());
        } else {
            ret.push(this[i]);
        }
    }
    return ret;
};
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flatten() // [0, 1, 2, 3, 4, 5]


编辑#1:好吧,思考一下函数式的方法(除了使用Y组合子的命名递归外:d)。

function flatten(ary) {
  return ary.reduce(function(a, b) {
    if (Array.isArray(b)) {
      return a.concat(flatten(b))
    }
    return a.concat(b)
  }, [])
}

让我们采用一些ES6语法,使它更短,只需一行。

const flatten = (ary) => ary.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), [])

但是请记住,这个无法作为数组方法应用,因为箭头函数没有自己的this


编辑#2:随着最新的Array.prototype.flat提案,这变得非常简单。数组方法接受一个可选参数depth,指定要展开多少层嵌套的数组结构(默认为1)。

[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat()  // [[[[0]], [1]], [[[2], [3]]], [[4], [5]]]
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(2) // [[[0]], [1], [[2], [3]], [4], [5]]
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(3) // [[0], 1, [2], [3], 4, 5]
[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(4) // [0, 1, 2, 3, 4, 5]

所以要展平任意深度的数组,只需使用Infinity调用flat方法。

[[[[[0]], [1]], [[[2], [3]]], [[4], [5]]]].flat(Infinity) // [0, 1, 2, 3, 4, 5]

0