[英]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]
你可以使用reduce
和Array.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.