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;ia.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本身中看到这两个方法的代码。