使用JavaScript从数组中删除对象

787

如何从数组中删除一个对象? 我想要从someArray中删除包含名字Kristian的对象。例如:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

我想要实现:

someArray = [{name:"John", lines:"1,19,26,96"}];
32个回答

3
如果您想删除所有符合某些条件的给定对象,则可以在for循环内使用javascript splice方法。由于删除对象会影响数组长度,请确保递减计数器一步,以便保持长度检查不变。
var objArr=[{Name:"Alex", Age:62},
  {Name:"Robert", Age:18},
  {Name:"Prince", Age:28},
  {Name:"Cesar", Age:38},
  {Name:"Sam", Age:42},
  {Name:"David", Age:52}
];

for(var i = 0;i < objArr.length; i ++)
{
  if(objArr[i].Age > 20)
  {
    objArr.splice(i, 1);
    i--;  //re-adjust the counter.
  }
}

上面的代码片段移除了所有年龄大于20岁的对象。

3

我想答案非常分支和复杂。

您可以使用以下路径,在现代JavaScript术语中删除与给定对象匹配的数组对象。


coordinates = [
    { lat: 36.779098444109145, lng: 34.57202827508546 },
    { lat: 36.778754712956506, lng: 34.56898128564454 },
    { lat: 36.777414146732426, lng: 34.57179224069215 }
];

coordinate = { lat: 36.779098444109145, lng: 34.57202827508546 };

removeCoordinate(coordinate: Coordinate): Coordinate {
    const found = this.coordinates.find((coordinate) => coordinate == coordinate);
    if (found) {
      this.coordinates.splice(found, 1);
    }
    return coordinate;
  }

3
您可以使用 map 函数。
someArray = [{name:"Kristian", lines:"2,5,10"},{name:"John",lines:"1,19,26,96"}];
newArray=[];
someArray.map(function(obj, index){
    if(obj.name !== "Kristian"){
       newArray.push(obj);
    }
});
someArray = newArray;
console.log(someArray);

1
但是如果你想要迭代数组,使用forEach是否更好呢? - corse32
map() 函数会遍历数组。 - Isaac Pak

2

您的数组语法似乎有误,因此假设您指的是数组而不是对象,Array.splice 可以帮助您:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
someArray.splice(1,1)

2

这是我使用的内容。


Array.prototype.delete = function(pos){
    this[pos] = undefined;
    var len = this.length - 1;
    for(var a = pos;a < this.length - 1;a++){
      this[a] = this[a+1];
    }
    this.pop();
  }

那么,只需说:
var myArray = [1,2,3,4,5,6,7,8,9];
myArray.delete(3);

将任何数字替换成“三”。期望输出结果为:
console.log(myArray); //Expected output 1,2,3,5,6,7,8,9

1
你的删除函数只是splice的更差版本。 - Ryan Shillington

2
您也可以使用 some 方法:
someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

someArray.some(item => { 
    if(item.name === "Kristian") // Case sensitive, will only remove first instance
        someArray.splice(someArray.indexOf(item),1) 
})

2

1

返回数组中属性name不是"Kristian"的对象

var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });


演示:

 var someArray = [
                {name:"Kristian", lines:"2,5,10"},
                {name:"John", lines:"1,19,26,96"},
                {name:"Kristian", lines:"2,58,160"},
                {name:"Felix", lines:"1,19,26,96"}
                ];
    
var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });

console.log(noKristianArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


1

splice(i, 1)将删除数组的增量索引处的对象。 但请记住,splice还会重置数组长度,因此要注意“undefined”。使用您的示例,如果删除“Kristian”,那么在循环的下一次执行中,i将是2,但someArray的长度将为1,因此如果您尝试删除“John”,您将获得一个“undefined”错误。虽然不太优雅,但解决此问题的一种方法是具有单独的计数器以跟踪要删除的元素的索引。


1

你可以像这样进行筛选:

const someArray = [{
    name: "Kristian",
    lines: "2,5,10"
  },
  {
    name: "John",
    lines: "1,19,26,96"
  }
];
var filtered = someArray.filter((el) => el.name != "Kristian");
console.log(filtered)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接