如何在JavaScript中高效地连接N个对象数组?
这些数组是可变的,结果可以存储在其中一个输入数组中。
如何在JavaScript中高效地连接N个对象数组?
这些数组是可变的,结果可以存储在其中一个输入数组中。
如果您要连接两个以上的数组,concat()
是为了便利和性能而使用的方法。
var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];
要将两个数组连接起来,可以利用push
方法接受多个参数的特性,将一个数组的元素添加到另一个数组的末尾,而无需创建新数组。使用slice()
方法也可以代替concat()
方法,但是似乎没有性能上的优势。
var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];
在ECMAScript 2015及更高版本中,这甚至可以进一步减少为
a.push(...b)
然而,对于大型数组(约为100,000个成员或更多),将元素数组传递给push
的技术(使用apply()
或ECMAScript 2015扩展运算符)可能会失败。 对于这样的数组,使用循环是更好的方法。有关详细信息,请参见 https://dev59.com/VnM_5IYBdhLWcg3wcSx_#17368101 。
a.concat(b)
测试用例似乎不必要地复制了数组 a
,然后将其丢弃。 - ninjagecko[].concat.apply([], [array1, array2, ...])
效率的证明: http://jsperf.com/multi-array-concat/7
评论中提到Tim Supinie可能会导致解释器超出调用堆栈大小。这可能取决于JavaScript引擎,但我至少在Chrome上也遇到了“Maximum call stack size exceeded”的情况。测试案例:[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
。(我也使用了当前被接受的答案得到了相同的错误,因此,不管选择哪种解决方案,如果你希望预料到这种用例或为其他人构建库,都需要进行特殊测试。)
新回答
要使用ES6处理多个数组的数组,请使用以下代码:
arr.flat();
例如:const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = arr.flat();
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
这将适用于Node版本大于11和现代浏览器。
旧的答案
(如果需要适用于旧版本的Node,可以保留此处内容):
对于多个数组的数组和ES6,请使用
Array.prototype.concat(...arr);
例如:
const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = Array.prototype.concat(...arr);
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
newArr = Array.from(new Set(newArr));
来删除重复元素。 - Dariusany[]
?类型已经被指定了 - 很奇怪。 - Simon_Weaver[].concat.apply([], ...arr)
在处理大量数据时表现更加优异。 - colemars您现在可以使用Spread语法来连接数组:
const arr1 = [0, 1, 2],
arr2 = [3, 4, 5];
const result1 = [...arr1, ...arr2]; // -> [0, 1, 2, 3, 4, 5]
// or...
const result2 = [...arr2, ...arr1]; // -> [3, 4, 5, 0, 1, 2]
使用Array.prototype.concat.apply来处理多个数组的连接:
var resultArray = Array.prototype.concat.apply([], arrayOfArraysToConcat);
例子:
var a1 = [1, 2, 3],
a2 = [4, 5],
a3 = [6, 7, 8, 9];
Array.prototype.concat.apply([], [a1, a2, a3]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
concat()
方法用于连接两个或多个数组。它不会改变现有的数组,只会返回连接后的副本。
array1 = array1.concat(array2, array3, array4, ..., arrayN);
concat
专门用于创建新数组,而不会改变原始数组。如果您想要更新 array1
,您需要使用 array1.push(...array2, ...array3, ...array4)
。 - adiga如果您正在通过map/filter/sort等处理结果的过程中,并且想要连接数组,请使用reduce
let sorted_nums = ['1,3', '4,2']
.map(item => item.split(',')) // [['1', '3'], ['4', '2']]
.reduce((a, b) => a.concat(b)) // ['1', '3', '4', '2']
.sort() // ['1', '2', '3', '4']
现在我们可以使用ES6
的Spread
语法来组合多个数组。
不要使用concat()
来连接数组,而是尝试使用Spread语法将多个数组组合成一个扁平化的数组。
例如:
var a = [1,2];
var b = [3,4];
var c = [5,6,7];
var d = [...a, ...b, ...c];
// resulting array will be like d = [1,2,3,4,5,6,7]
就这样解决了。
let arr = [[1, 2], [3, 4], [5, 6]];
console.log([].concat(...arr));
使用 ES6 进行缩写。
new Set([].concat(...Array));
let Array = [
['vue','babel','npm','gulp','mysql','less','laravel'],
['jquery','react','js','css','wordpress','html','bootstrap'],
['vue','babel','npm','gulp','mysql','less','laravel'],
['angular','cms','js','css','graphql','nodejs','php'],
['severless','headless','js','css','design','photoshop','php'],
]
const Boom = new Set([].concat(...Array));
// This is not necessary
let dStr = '';
Boom.forEach(e=>{
dStr += e + ' ';
})
document.write(dStr);
<div class="result"></div>
new Set()
does remove duplicated items. Just remove it. [].concat(...Array)
- ronaldtgi[...new Set([].concat(...myArray))]
返回一个 array
而不是一个 Set
。 - Diego Fortes