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

标签 javascript arrays

<分区>

正如我们所知,通过使用方法 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]?

最佳答案

递归的完美用例,可以处理更深层次的结构:

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-combinator 来实现纯函数式 :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), [])

但是请记住,这个不能作为数组方法应用,因为arrow functions没有他们自己的 this


编辑 #2:使用最新的 Array.prototype.flat 提案,这非常容易。 array 方法接受一个可选参数 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]

关于javascript - 如何在 javascript 中展平嵌套数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27266550/

相关文章:

javascript - 为什么我的变量仍然未定义?

javascript - 用js获取html源码相关的选中html元素偏移量

javascript - JavaScript 数组文字定义中逗号后的值是什么?

javascript - Observable 中的 Async/Await

c++ - cocos2d-x:来自另一个类的 CRUD 二维数组

javascript - 我应该怎么做才能通过 Servlet 在另一个 JSP 页面的 <div> 标记中加载一个 JSP 页面?

javascript - JS/ES6 : Check if every array element has a child in another array

javascript - 如何使用 `if` 条件和分隔符拆分字符串

javascript - 加载自定义 json 文件 - highcharts.js

arrays - 在 TypeScript 中为特定类型扩展数组