我们都知道,你可以做..ES6采用扩展到Concat的多个阵列
let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5]
但是,你怎么做这个充满活力的以Concat的ñ阵列? Thx
我们都知道,你可以做..ES6采用扩展到Concat的多个阵列
let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5]
但是,你怎么做这个充满活力的以Concat的ñ阵列? Thx
一种选择是使用reduce
:
let arrs = [[1, 2], [3, 4], [5, 6]];
arrs.reduce((a, b) => [...a, ...b], []);
当然,这是一个缓慢的溶液(二次时间)。或者,如果您可以使用Lodash,则_.flatten
完全符合您的要求,并且可以更有效地执行(线性时间)。
编辑
或者,改编自下面Xotic750的评论,
[].concat(...arrs);
这应该是有效的(线性时间)。
一个你有你的阵列在一个数组中,你可以。 'Array.prototype.concat.apply([],arr)'尽管这不再使用扩展运算符。 – Xotic750
@ Xotic750不错,但你可以使用扩散算子做到这一点!看我的编辑。 –
单独使用扩展语法无法做到这一点,因为扩展语法要求您知道预先连接了多少个数组。但是,您可以编写以下功能:
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);
另一种选择可能是:
const nArrays = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9],
[10, 11]
];
const flattened = [].concat(...nArrays);
console.log(flattened)
您可以使用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);
你可以使用一个递归函数和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
同样的事情。这是类似到接受的答案,但在这种情况下
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]
let fruits = ["apples", "bananas", "pears"];
let vegetables = ["corn", "potatoes", "carrots"];
let produce = [...fruits, ...vegetables];
console.log(produce);
x.concat(y)
是完全可以接受的(可能快堆)
这个给定的代码与给定的问题完全相同。这不是为N个数组制作dynamiclly concat解决方案的答案。 –
您可以将动态数组存储在数组中...... –
或一个数组作为值的对象。不可能迭代未知数量的个体变量 – charlietfl
为什么你必须使用扩散算子? 'concat'方法仍然有效...... –