使用ES6扩展运算符将多个数组连接在一起

68

我们都知道你可以做:

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

但是,如何使它动态地连接N个数组?


你可以将动态数组存储在一个数组中... - Nina Scholz
1
返回一个包含数组值的对象,无法迭代未知数量的单独变量。 - charlietfl
5
为什么必须使用扩展运算符?concat方法仍然可用... 建议翻译:为什么需要使用扩展运算符?concat方法仍然可以使用... - Heretic Monkey
Array.prototype.concat对您来说不够用吗?https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/concat - Mike Cheel
哦,将Function.prototype.call.bind(Array.prototype.concat)转换为ES5格式 :) - Yury Tarabanko
这个回答解决了你的问题吗?合并/展平一个数组的数组 - SuperStormer
10个回答

87

一种选项是使用 reduce

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

当然,这是一种缓慢的解决方案(二次时间)。或者,如果您可以使用 Lodash,则_.flatten正好做到了您想要的,并且更有效率(线性时间)。

编辑

或者,根据下面 Xotic750 的评论改编:

[].concat(...arrs);

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


3
当你把数组放在一个数组中后,你可以使用 Array.prototype.concat.apply([], arr)。尽管这不再使用扩展运算符。 - Xotic750
1
@Xotic750 不错,但你可以使用展开运算符来实现!请看我的修改。 - Brian McCutchon
1
请注意,在 TypeScript 中,如果您希望返回值为 number[] 而不是 any[],则需要强制将空数组进行类型标注(例如:([] as number[]).concat(...arrs))。 - Simon_Weaver
有没有其他新的解决方案? - undefined

22

另一个选项可能是:

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


13
自 ES2019 起,您可以使用 nArrays.flat() - cayhorstmann

17

let fruits = ["apples", "bananas", "pears"];
let vegetables = ["corn", "potatoes", "carrots"];

let produce = [...fruits, ...vegetables];


console.log(produce);


14
这段给出的代码与所提供的问题完全相同。它不是为N个数组动态拼接解决方案的答案。 - yue you

4

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

例子:

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

结果将是:

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

愉快编码...


3

以下方法对我有效(使用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);


2
你可以在 for..of 循环中使用展开语法将数组值连接成一个单独的数组。

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);


2
您不能仅使用展开语法来完成此操作,因为展开语法要求您预先知道要连接的数组数量。但是,您可以编写以下函数:
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);

1
你可以使用递归函数和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]


1
我们可以使用es6来解决问题,如下所示。
function mergeTwo(arr1, arr2) {
  let result = [...arr1, ...arr2];
  return result.sort((a,b) => a-b);
}

0

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

console.log(arrs);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接