我正在尝试删除基于对象属性的字符串匹配的元素,但是当我在javascript数组上执行切片时,数组大小减小并且索引更改。请帮助解决方案。这是一个jsfiddle link。
代码
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);
}
}
}
答案 0 :(得分:1)
添加i--;
function removeitem(item) {
for (var i = 0; i < selection.length; i++) {
if (selection[i].hasOwnProperty(item)) {
selection.splice(i, 1);
i--;
}
}
}
答案 1 :(得分:0)
假设您在使用undefined
作为新值时遇到问题,那么您可以拨打delete[i];
而不是selection.splice(i, 1);
,在这种情况下,长度不会改变,指数也不会。
答案 2 :(得分:0)
Abhi1964
和Loolooii
解决方案似乎都能正常工作并解决问题,但我个人会将过滤后的结果保存在单独的数组中,而不是在同一个数组中操作索引/删除值,原因是,单独的数组会使代码看起来更容易阅读和理解。审阅者无需了解索引操作或跟踪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.
注意:强> 我没有运行此代码,如果出现一些错误,请随时编辑。