我有两个数组。第一个数组包含一些值,而第二个数组包含一些应插入第一个数组的元素。例如:
var aArr = [ {'a':111}, {'b':222}, {'c':333} ... ]
var bArr = [ {'x': 0}, {'y': 0} ] // I'm not sure it's length
// finail I need got something like
var aArr = [{'x': 0}, {'y': 0}, {'c':333} ...]
和bArr数组不确定它的长度,也许它有一个元素
var aArr = [ {'a':111}, {'b':222}, {'c':333} ... ]
var bArr = [ {'x': 0} ]
// finail I need got something like
var aArr = [{'x': 0}, {'b': 222}, {'c':333} ...]
var a = [1, 2, 3],
b = [4, 5];
function prependArray(a, b) {
a.splice(0, b.length, b);
return a;
}
var result = prependArray(a, b);
// result = [[4, 5], 3] not [ 4, 5, 3]
我该怎么办? ? 我需要更有效的方法,因为aArr有超过3000个值,而bArr有超过100个值。
感谢。
答案 0 :(得分:4)
有很多方法可以做到这一点,但没有多少方法可以保留原始aArr
引用(例如,修改实际的aArr数组而不创建新的aArr数组)。这是一种方式:
aArr.splice(0, bArr.length); // remove front-most bArr.length items from aArr
aArr.unshift.apply(aArr, bArr); // insert bArr items in front of aArr
这会删除bArr.length
个aArr
项,然后将bArr
项添加到aArr
的前面,同时保留原始aArr
引用(例如,不用新数组替换它)。
它也可以在一个.splice()
中完成,但这需要构建一个临时数组传递给.splice.apply()
,这似乎不值得,因为它创建一个全新的数组只是为了节省一行代码。无论如何,这看起来像这样:
aArr.splice.apply(aArr, [0, bArr.length].concat(bArr));
如果你真的想要最高效率"在性能而不是代码行方面,您可能需要使用jsperf等工具在多个浏览器中进行性能基准测试。可能只是简单地将bArr项目复制到arr中是最有效的"因为它具有最少的阵列操作。要确切知道,您必须在多个浏览器中测量典型阵列大小的实际性能。
对于纯粹的表现,你应该测试这个与上面的选项:
for (var i = 0, len = bArr.length; i < len; i++) {
aArr[i] = bArr[i];
}
这样做的好处是它不会创建任何临时数组,也不必转移aArr
周围的项目。它的缺点是在普通的javascript中运行循环,而不是在本机数组操作代码中运行。
似乎只复制元素的最后一个选项在Chrome中快7倍,在IE11中快10倍,在Firefox中差异更大。
请在此处查看jsperf:http://jsperf.com/array-shift-vs-copy
答案 1 :(得分:1)
function prependArray(a, b) {
return a.splice.apply(a, [0, b.length].concat(b))
}
感谢顺磁性羊角面包(* _ *)
答案 2 :(得分:0)
Javascript中有一个concat-Method:
result = b.concat(a);
编辑:忘记删除以下内容中的旧值:
连续后,应用拼接:
result.splice(b.length, b.length);
答案 3 :(得分:0)
var aArr = [{
'a': 111
}, {
'b': 222
}, {
'c': 333
}]
var bArr = [{
'x': 0
}, {
'y': 0
}] // I'm not sure it's length
for (var i = 0; i < bArr.length; i++) {
if (i > aArr.length) break;
aArr[i] = bArr[i];
}
//show the results
document.write(JSON.stringify(aArr));
The result should be:
<br>
<code>
[{'x': 0}, {'y': 0}, {'c':333}]
</code>
<br>And it is:
<br>
答案 4 :(得分:0)
在ECMAScript 6中:
a.splice(0, b.length, ...b);
答案 5 :(得分:0)
另一个想法是
bArr.concat(aArr.slice(bArr.length))
换句话说,切掉第一个数组的前n个元素,其中n是第二个数组的长度,然后将其附加到第二个数组。