2017-04-17 38 views
3

我们都知道,你可以做..ES6采用扩展到Concat的多个阵列

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

但是,你怎么做这个充满活力的以Concat的ñ阵列? Thx

+0

您可以将动态数组存储在数组中...... –

+0

或一个数组作为值的对象。不可能迭代未知数量的个体变量 – charlietfl

+5

为什么你必须使用扩散算子? 'concat'方法仍然有效...... –

回答

6

一种选择是使用reduce

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

当然,这是一个缓慢的溶液(二次时间)。或者,如果您可以使用Lodash,则_.flatten完全符合您的要求,并且可以更有效地执行(线性时间)。

编辑

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

[].concat(...arrs); 

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

+0

一个你有你的阵列在一个数组中,你可以。 'Array.prototype.concat.apply([],arr)'尽管这不再使用扩展运算符。 – Xotic750

+1

@ Xotic750不错,但你可以使用扩散算子做到这一点!看我的编辑。 –

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

另一种选择可能是:

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

1

您可以使用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);

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同样的事情。这是类似到接受的答案,但在这种情况下

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]

5

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

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

 

 
console.log(produce);

不无谓使用传播语法,其中 x.concat(y)是完全可以接受的(可能快堆)
+1

这个给定的代码与给定的问题完全相同。这不是为N个数组制作dynamiclly concat解决方案的答案。 –