在javascript中从数组中删除对象

时间:2014-08-30 12:27:16

标签: javascript arrays json javascript-objects

我有这个包含简单对象的数组

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未按预期保持不变。我做错了什么?

3 个答案:

答案 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
    ]