繁体   English   中英

使用 es6 spread 连接多个数组

[英]Using es6 spread to concat multiple arrays

我们都知道你可以做到:

let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5]

但是你如何使这个动态连接 N 个数组呢?

一种选择是使用reduce

let arrs = [[1, 2], [3, 4], [5, 6]];
arrs.reduce((a, b) => [...a, ...b], []);

当然,这是一个缓慢的解决方案(二次时间)。 或者,如果您可以使用 Lodash, _.flatten可以完全满足您的需求,并且效率更高(线性时间)。

编辑

或者,改编自 Xotic750 下面的评论,

[].concat(...arrs);

这应该是有效的(线性时间)。

另一种选择可能是:

 const nArrays = [ [1, 2, 3, 4, 5], [6, 7, 8, 9], [10, 11] ]; const flattened = [].concat(...nArrays); console.log(flattened)

 let fruits = ["apples", "bananas", "pears"]; let vegetables = ["corn", "potatoes", "carrots"]; let produce = [...fruits, ...vegetables]; console.log(produce);

以下解决方案适用于我(ES6 中的扩展运算符):

 let array = ['my','solution','works']; let newArray = []; let newArray2 = []; newArray.push(...array); //adding to same array newArray2.push([...array]); //adding as child/leaf/sub-array console.log(newArray); console.log(newArray2);

您不能单独使用扩展语法来做到这一点,因为扩展语法要求您提前知道要连接的数组数量。 但是,您可以编写以下函数:

function concatN(...arguments) {
    let accumulator = [];
    for(let arg = 0; arg < arguments.length; arg = arg + 1) {
        accumulator = [...accumulator, ...arguments[arg]];
    }
    return accumulator;
}

不过,它可能不会非常有效(重复使用扩展语法是 O(n²))。 使用Array.prototype.concat会更好。 你可以这样做:

[].concat(all, of, your, arrays);

您可以在for..of循环中使用 spread 元素将数组值连接到单个数组

 let arr1 = [1,2,3]; let arr2 = [3,4,5]; let arr3 = []; for (let arr of [arr1, arr2 /* , arrN */]) arr3.push(...arr); console.log(arr3);

您可以使用递归函数和Array.prototype.concat

 const concatN = (x,...xs) => x === undefined ? [] : x.concat(concatN(...xs)) console.log(concatN([1,2,3], [4,5,6], [7,8,9])) // [1,2,3,4,5,6,7,8,9]

你可以使用reduceArray.prototype.concat做同样的事情。 类似于接受的答案,但在这种情况下不会无谓地使用传播语法,其中x.concat(y)是完全可以接受的(并且可能堆得更快)

 const concatN = (...xs) => xs.reduce((x,y) => x.concat(y), []) console.log(concatN([1,2,3], [4,5,6], [7,8,9])) // [1,2,3,4,5,6,7,8,9]

最好的选择是使用 FlatMap,它可以帮助我们将多个数组合并为一个数组。

例子:

let arrs = [[1, 2], [3, 4], [5, 6]];
arrs.flatMap(a => a);

结果将是

> (6) [1, 2, 3, 4, 5, 6]

快乐编码...

我们可以通过以下方式使用es6解决

function mergeTwo(arr1, arr2) {
  let result = [...arr1, ...arr2];
  return result.sort((a,b) => a-b);
}

 let arr1 = [1,2,3]; let arr2 = [3,4,5]; let arrs = [arr1, arr2].flat(); // [1,2,3,3,4,5] console.log(arrs);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM