在javascript中更新数组元素时,splice push vs是否获得该值?

在javascript中更新数组元素时,splice push vs是否获得该值?,javascript,arrays,Javascript,Arrays,关于如何更新数组元素,这里有两种方法 var x = [{test: 'test', id: 1}, {test: 'test2', id: 2}, {test: 'test3', id: 3}]; 拼接推送 for(var i in x) { if(x[i].id === 2) { x.splice(i, 1); x.push({test: 'updated', id: 3}); break; } } 获取值 for(var

关于如何更新数组元素,这里有两种方法

var x = [{test: 'test', id: 1}, {test: 'test2', id: 2}, {test: 'test3', id: 3}];
拼接推送

for(var i in x) {
    if(x[i].id === 2) {
        x.splice(i, 1);
        x.push({test: 'updated', id: 3});
        break;
    }
}
获取值

for(var i in x) {
    if(x[i].id === 1) {
        x[i] = {test: 'updated', id: 3}
        break;
    }
}

我不确定哪一个更有效,比如更快或更少的内存使用。非常感谢您的建议。

splice
可能相当昂贵。我运行了一些jsPerf测试,并添加了另一个示例

到目前为止,最慢的是拼接-通过迭代直接更新的速度大约是slice的2倍,但是创建一个对象映射然后直接访问是目前最快的

我的第三个测试也是最快的选择是:

xMap[testID ] = {name: 'updated', id:3};
如果您有唯一的id,则可以执行此操作以将数组转换为对象映射

for(var i = 0; i < x.length; i++){
    xMap[x[i].id] = x[i];
 }
for(变量i=0;i
我的选项内存效率较低,但速度要快得多。但是,如果使用新对象更新数据,则可能需要更新地图

更新: 更改为
for(var i=0;i
样式循环会使Chrome上的运行速度大大加快!拼接仍然很慢,但直接更新在地图的13%以内


但值得注意的是,随着数据大小的增加,这些数据也可能会发生变化,因此在测试一个与最大基准测试时所期望的数据集大小类似的数据集时,可能值得注意的是:)

不建议在数组的每个元素上循环使用for..in,除非您有充分的理由这样做并避免继承属性(除非您特别想访问它们)。很可能,一旦找到所要查找的元素,就应该中断循环,除非您希望找到多个元素。这两个示例都创建id为3的重复元素。有了它,您可以一次更换元件,无需拼接和推动。@RobG-好的,我的坏消息,我添加了一个
中断
。但是,是的,关于循环,你会推荐什么,然后回到我的问题,哪一个更好,还是得到值?@RobG-我明白了。所以我一个人。非常感谢让我try@RobG-非常感谢它的工作:)
对于(x中的变量i){if(x[i].id==2){x.splice(i,1,{test:'updated',id:3});break;}
:)--哇,这真的澄清了我的问题。非常感谢。我只是将你包含的链接添加到书签中。非常感谢,朋友DYou非常受欢迎-我刚刚添加了两个测试-使用
for(var I=0;I
style loop将直接映射带到Chrome上地图的10%以内,因此也是一个可行的选择-可能也值得在其他一些浏览器上运行测试,因为结果可能会有所不同,但我认为
splice
的结果总是最差:)多年来对数组变异方法进行了多次比较,(例如,Firefox中的性能差异可以忽略不计)。实现、方法和场景之间存在很大差异。底线是性能是否不是问题(而且很少是),最具语义且最易于维护的方法比偶尔节省几纳秒的方法具有更高的意义。说得好@RobG我完全同意,易于维护通常是最重要的事情,如果需要,优化应该稍后进行。