开发者问题收集

从对象数组中删除对象

2015-05-02
74150

我有一个对象数组:

[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]

如何删除此项 {"value":"14","label":"7"> 并生成新数组:

 [{"value":"14","label":"7"},{"value":"18","label":"7"}]

3个回答

在 ES6 中(或使用 es6-shim ),您可以使用 Array.prototype.findIndex 以及 Array.prototype.splice :

arr.splice(arr.findIndex(matchesEl), 1);

function matchesEl(el) {
    return el.value === '14' && el.label === '7';
}

或者,如果数组的副本没问题(自 ES5 起可用), Array.prototype.filter 是前往:

var withoutEl = arr.filter(function (el) { return !matchesEl(el); });
Noah Freitas
2015-05-02

使用身份的解决方案

如果您具有对象身份而不仅仅是对象相等性(即,您试图从数组中删除特定对象,而不仅仅是包含与现有对象相同数据的对象),您可以使用 splice 和 indexOf 非常简单地执行此操作:

a = {x:1}
b = {x:2}
arr = [a,b]

假设您要删除 b:

arr.splice(
  arr.indexOf(b), 1
);

使用平等的解决方案

这个问题不清楚我们是在处理身份还是平等。如果有相等性(两个对象包含相同的内容,它们看起来彼此相同,但实际上并不是同一个对象),则需要一个小比较函数,我们可以将其传递给 findIndex。

a = {x: 1};
b = {x: 2};
arr = [a, b];

现在我们要删除 c,它等于 a,但不相同:

c = {x: 1}

index = arr.findIndex(
  (i) => i.x === c.x
)

if (index !== -1) {
  arr.splice(
    index, 1
  );
}    

请注意,我在这里将 ES6 样式的 lambda 函数作为第一个参数传递给 findIndex。

除非您有能力只为常用浏览器编写代码,否则您可能希望使用 Babel 这样的转译器来使用此解决方案。

具有不变性的解决方案

如果您关心不变性,并且想要返回一个新数组,则可以使用过滤器来实现:

a = {x: 1};
b = {x: 2};
arr = [a, b];

让我们保留所有不是 a 的内容:

newArr = arr.filter((x) => x != a)
superluminary
2016-04-15

尝试:

var ar = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];

for(var i=0; i < ar.length; i++) {
   if(ar[i].value == "14" && ar[i].label == "7")
   {
      ar.splice(i,1);
   }
}

演示

Edgar Orozco
2015-05-02