我有这个包含简单对象的数组
var data = [
{type:1, owner:"jason"},
{type:1, owner:"john"},
{type:2, owner:"jason"},
{type:2, owner:"alice"},
{type:2, owner:"bob"},
{type:2, owner:"clark"},
{type:1, owner:"david"}
]
我试图遍历数组并仅删除类型为1的元素。这就是我的尝试。
for(var i = 0; i < data.length; i++){
if(data[i].type === 1){
data.splice(i,1)
}
}
假设在循环运行之后所有类型1元素将从数组中删除,我是不是很愚蠢。在chrome dev工具中运行后,该数组仍然包含{type:1,owner:&#34; jason&#34;}以及所有类型:2&#39; s未按预期保持不变。我做错了什么?
答案 0 :(得分:3)
你必须在拼接后递减i
i--;
BTW我想使用过滤器并将结果分配给同一个data
变量,如下文
data = data.filter(function(obj) {
return obj.type !== 1;
})
console.log(data);
答案 1 :(得分:1)
你应该在拼接后运行i--因为splice调整了数组大小,删除后数组索引会立即改变。
for(var i = 0; i < data.length; i++){
if(data[i].type === 1){
data.splice(i,1);
i--;
}
}
答案 2 :(得分:1)
每当拼接var数据时,i减1。 因为这意味着对象的数组列表变得越来越小,因此索引位置会发生变化。
由于你没有减少1,你从位置0的jason开始,然后直接跳到位置2的jason。为什么会发生这种情况?由于您在开头切片了一个对象,因此您的索引位置会像这样移动。
第一次循环:i = 0
var data = [
{type:1, owner:"jason"},//position 0
{type:1, owner:"john"},//position 1
{type:2, owner:"jason"},//position 2
{type:2, owner:"alice"},//position 3
{type:2, owner:"bob"},//position 4
{type:2, owner:"clark"},//position 5
{type:1, owner:"david"}//position 6
]
第二个循环i = 1
var data = [
{type:1, owner:"jason"},//SPLICED
{type:1, owner:"john"},// position 0
{type:2, owner:"jason"}, //position 1
{type:2, owner:"alice"},// position 2
{type:2, owner:"bob"},//position 3
{type:2, owner:"clark"},//position 4
{type:1, owner:"david"}//position 5
]