在javascript中从数组中删除对象

在javascript中从数组中删除对象,javascript,arrays,json,javascript-objects,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 <

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

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)
  }
}
for(变量i=0;i

如果我认为在循环运行之后,所有类型1元素都将从数组中删除,那会是愚蠢的吗。在chrome开发工具中运行此命令后,数组仍然包含{type:1,owner:“jason”},并且所有type:2都未按预期进行更改。我做错了什么?

拼接后只需减小
i

i--;
顺便说一句,我只想使用过滤器,并将结果分配给相同的
数据
变量,如下所示

data = data.filter(function(obj) {
    return obj.type !== 1;
})

console.log(data);

拼接后只需减小
i

i--;
顺便说一句,我只想使用过滤器,并将结果分配给相同的
数据
变量,如下所示

data = data.filter(function(obj) {
    return obj.type !== 1;
})

console.log(data);
您应该在splice之后运行i--after,因为splice会调整数组的大小,所以删除后数组索引会立即更改

for(var i = 0; i < data.length; i++){
  if(data[i].type === 1){
     data.splice(i,1);
     i--;
  }
}
for(变量i=0;i
您应该在splice之后运行i--after,因为splice会调整数组的大小,所以删除后数组索引会立即更改

for(var i = 0; i < data.length; i++){
  if(data[i].type === 1){
     data.splice(i,1);
     i--;
  }
}
for(变量i=0;i
每当拼接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
    ]

每当拼接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
    ]

但索引0的处理方式必须有所不同。索引0在i--之后将为-1,但在当前循环在i++之后结束时将再次为0。谢谢@worldash。我想我对拼接方法的理解是有限的。虽然索引0必须以不同的方式处理。索引0在i--之后将为-1,但在当前循环在i++之后结束时将再次为0。谢谢@worldash。我想我对拼接方法的理解是有限的。哇!这就像魔术一样奏效。谢谢@Mritunjay。我想我更喜欢这种过滤解决方案。你知道这在大数据集上的表现有多好吗?哇!这就像魔术一样奏效。谢谢@Mritunjay。我想我更喜欢这种过滤解决方案。知道这在大型数据集上的表现有多好吗?+1作为解释。这正是我想知道的@Amna Irfan感谢:)+1的解释。这正是我想知道的@阿姆娜·伊凡:谢谢