在 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://stackoverflow.com/a/17368101/96100。
[].concat.apply([], [array1, array2, ...])
编辑:效率证明:http : //jsperf.com/multi-array-concat/7
edit2:Tim Supinie 在评论中提到这可能会导致解释器超出调用堆栈大小。这可能取决于 js 引擎,但至少我在 Chrome 上也遇到了“超出最大调用堆栈大小”的情况。测试用例:[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (我在使用当前接受的答案时也遇到了同样的错误,因此人们正在预测此类用例或为其他人构建库,无论您选择哪种解决方案,都可能需要进行特殊测试。)
您现在可以使用 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]
该concat()
方法用于连接两个或多个数组。它不会更改现有数组,它只返回连接数组的副本。
array1 = array1.concat(array2, array3, array4, ..., arrayN);
使用 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]