2014-11-22 74 views
0

我想删除基于对象属性的字符串匹配的元素,但是当我在javascript数组上执行切片时,数组大小减小并且索引更改。请帮助解决方案。同样的,这里是jsfiddle link如何匹配并从javascript数组中删除一个对象?

代码

var selection = JSON.parse('[{"Connectors":"c1"},{"Connectors":"c2"},{"Schedules":"s1"},{"Schedules":"s2"},{"Gauges":"g1"},{"Gauges":"g2"},{"Gauges":"g3"}]'); 

removeitem("Gauges"); 

function removeitem(item) { 
    for (var i = 0; i < selection.length; i++) { 
     if (selection[i].hasOwnProperty(item)) { 
      selection.splice(i, 1); 
     } 
    } 
} 
+1

如果你不想索引改变,你应该调用'delete selection [i]'而不是'selection.splice(i,1);'。 – Loolooii 2014-11-22 12:57:06

+0

@Loolooii:它会使它成为'未定义'。这不会导致问题吗? – abi1964 2014-11-22 13:00:47

+0

@ abi1964取决于他想做什么。他显然不希望大小和指数改变,所以我不这么认为。 – Loolooii 2014-11-22 13:07:20

回答

2

添加i--;

function removeitem(item) { 
    for (var i = 0; i < selection.length; i++) { 
     if (selection[i].hasOwnProperty(item)) { 
      selection.splice(i, 1); 
      i--; 
     } 
    } 
} 

jsfiddle example

1

假设你没有与具有undefined作为新值的问题,那么你可以调用delete[i];代替selection.splice(i, 1);在这种情况下,长度不会改变,指数也不会改变。

1

两个Abhi1964Loolooii解决方案似乎正常工作和解决问题,但我会亲自守在单独的阵列,而不是在同一阵列中操纵指数/删除值过滤的结果,原因是,从独立阵列会使代码看起来更简单阅读和理解。审阅者不需要了解索引操作或跟踪undefined

var selection = JSON.parse('[{"Connectors":"c1"},{"Connectors":"c2"},{"Schedules":"s1"},{"Schedules":"s2"},{"Gauges":"g1"},{"Gauges":"g2"},{"Gauges":"g3"}]'); 

removeitem("Gauges"); 
var filteredResult = []; 
function removeitem(item) { 
    for (var i = 0; i < selection.length; i++) { 
     if (selection[i].hasOwnProperty(item)) { 

     }else{ 
      filteredResult.push(item); 
     } 
    } 
} 

//use filtered result as per your need. 

注: 我没有运行此代码,如果一些错误似乎是有,请随时编辑。

相关问题