javascript数组取消某些元素的移位

javascript数组取消某些元素的移位,javascript,arrays,splice,Javascript,Arrays,Splice,我有两个数组。第一个数组包含一些值,而第二个数组包含一些应该插入到第一个数组中的元素。例如: 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} ...] bAr

我有两个数组。第一个数组包含一些值,而第二个数组包含一些应该插入到第一个数组中的元素。例如:

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} ...]
我使用的拼接不太好 我该怎么办? 我需要更有效的方法,因为aArr有3000多个值,而bArr有100多个值


谢谢。

Javascript中有一个concat方法:

result = b.concat(a);
编辑:忘记删除以下文件中的旧值:

接合后,应用拼接:

result.splice(b.length, b.length);

工作示例:

Javascript中有一个concat方法:

result = b.concat(a);
编辑:忘记删除以下文件中的旧值:

接合后,应用拼接:

result.splice(b.length, b.length);

工作示例:

有很多方法可以做到这一点,但保留原始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
这将从aArr中删除第一个bArr.length项,然后将bArr项添加到aArr的前面,同时保留原始aArr引用,例如,不使用新数组替换它

它也可以在一个.splice中完成,但这需要构建一个临时数组来传递给.splice.apply,这似乎不值得,因为这样做只需要保存一行代码就可以创建一个全新的数组。在任何情况下,看起来都是这样的:

aArr.splice.apply(aArr, [0, bArr.length].concat(bArr));
如果您真的希望在性能方面而不是在代码行方面获得最大效率,那么您可能需要使用诸如jsperf之类的工具进行性能基准测试,并在多个浏览器中进行测试。可能简单地将bArr项复制到aArr中是最有效的,因为它具有最少的数组操作。要确定这一点,您必须跨多个浏览器测量典型阵列大小下的实际性能

为了获得纯粹的性能,您应该对比上面的选项进行测试:

for (var i = 0, len = bArr.length; i < len; i++) {
    aArr[i] = bArr[i];
}
这样做的优点是它不创建任何临时数组,并且不必在aArr中来回移动项。它的缺点是在普通javascript中运行循环,而不是在本机数组操作代码中运行循环

在Chrome中,复制元素的最后一个选项似乎快了7倍,在IE11中快了10倍,在Firefox中更是如此

请参见此处的jsperf:


有很多方法可以做到这一点,但保留原始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
这将从aArr中删除第一个bArr.length项,然后将bArr项添加到aArr的前面,同时保留原始aArr引用,例如,不使用新数组替换它

它也可以在一个.splice中完成,但这需要构建一个临时数组来传递给.splice.apply,这似乎不值得,因为这样做只需要保存一行代码就可以创建一个全新的数组。在任何情况下,看起来都是这样的:

aArr.splice.apply(aArr, [0, bArr.length].concat(bArr));
如果您真的希望在性能方面而不是在代码行方面获得最大效率,那么您可能需要使用诸如jsperf之类的工具进行性能基准测试,并在多个浏览器中进行测试。可能简单地将bArr项复制到aArr中是最有效的,因为它具有最少的数组操作。要确定这一点,您必须跨多个浏览器测量典型阵列大小下的实际性能

为了获得纯粹的性能,您应该对比上面的选项进行测试:

for (var i = 0, len = bArr.length; i < len; i++) {
    aArr[i] = bArr[i];
}
这样做的优点是它不创建任何临时数组,并且不必在aArr中来回移动项。它的缺点是在普通javascript中运行循环,而不是在本机数组操作代码中运行循环

在Chrome中,复制元素的最后一个选项似乎快了7倍,在IE11中快了10倍,在Firefox中更是如此

请参见此处的jsperf:

谢谢你的顺磁性羊角面包*_*

谢谢你的顺磁性牛角面包*.

var aArr=[{ “a”:111 }, { “b”:222 }, { c:333 }] var bArr=[{ “x”:0 }, { “y”:0 }]//我不确定它的长度 对于var i=0;iaArr.length break; aArr[i]=bArr[i]; } //显示结果 document.writeJSON.stringifyaArr; 结果应该是: [{'x':0},{'y':0},{'c':333}] 它是: var aArr=[{ “a”:111 }, { “b”:222 }, { c:333 }] var bArr=[{ “x”:0 }, { “y”:0 }]//我不确定它的长度 对于var i=0;iaArr.length break; aArr[i]=bArr[i]; } //显示结果 document.writeJSON.stringifyaArr; 结果应该是: [{'x':0},{'y':0},{'c':333}] 它是: 在ECMAScript 6中:

a.splice(0, b.length, ...b);
在ECMAScript 6中:

a.splice(0, b.length, ...b);
另一个想法是

bArr.concat(aArr.slice(bArr.length))
换句话说,切掉第一个数组的前n个元素,其中n是第二个数组的长度,然后将其附加到第二个数组。

另一个想法是

bArr.concat(aArr.slice(bArr.length))


换句话说,切掉第一个数组的前n个元素,其中n是第二个数组的长度,然后将其附加到第二个数组。

a=b.concata;?或者,如果可以使用ES 5,则a.0,0,…b@ParamagneticCroissant:很好的观点,但是做了错误的事情OP可以更清楚地描述出来,但这不是这里也不是那里。有了ES5,a.0,b.length,…b应该可以做到。@Amadan yap,我意识到太晚了,太糟糕了,我不能在5分钟后编辑我的评论…定义更有效的。你的意思是最少的代码行,最快的性能,不管有多少代码?或者别的什么?a=b.concata;?或者,如果可以使用ES 5,则a.0,0,…b@ParamagneticCroissant:很好的观点,但是做了错误的事情OP可以更清楚地描述出来,但这不是这里也不是那里。有了ES5,a.0,b.length,…b应该可以做到。@Amadan yap,我意识到太晚了,太糟糕了,我不能在5分钟后编辑我的评论…定义更有效的。你的意思是最少的代码行,最快的性能,不管有多少代码?或者别的什么?塔纳丁,这次你赢了:这会生成一个新的数组-它不会保留原来的aArr引用。我不是100%确定这是必需的,但它看起来似乎显示aArr正在被修改,而不是创建一个新的数组。tanaydin,这一次你赢了:这将创建一个新的数组-它不会保留原始的aArr引用。我不是100%确定这是必需的,但看起来OP显示aArr正在被修改,而不是创建一个新数组。b是什么意思?也许你是说ECMAScript 6?@torazaburo它只是ES6吗?我以为它已经在ES 5中了。@jfriend00它是参数解包。如果b是一个数组,那么…b扩展为包含b元素的参数列表。你最初声称ES5,把我搞糊涂了。b是什么意思?也许你是指ECMAScript 6?@torazaburo它只是ES6吗?我以为它已经在ES 5中了。@jfriend00它是参数解包。如果b是一个数组,那么…b将扩展为包含b元素的参数列表。您最初声明ES5时把我搞糊涂了。添加了jsperf引用。jsperf引用是什么?你从哪里得到的?@Manwal-我创建了一个jsperf性能测试,并在我的回答中链接到它。jsperf比较了完成任务的两种方法的性能。您可以在jsperf本身中看到这两个方法的代码?你从哪里得到的?@Manwal-我创建了一个jsperf性能测试,并在我的回答中链接到它。jsperf比较了完成任务的两种方法的性能。您可以在jsperf本身中看到这两个方法的代码。