从对象数组中删除对象

Art*_*lev 34 javascript arrays

我有一个对象数组:

[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
Run Code Online (Sandbox Code Playgroud)

如何删除此项{"value":"14","label":"7"}导致新数组:

 [{"value":"14","label":"7"},{"value":"18","label":"7"}]
Run Code Online (Sandbox Code Playgroud)

Noa*_*tas 85

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

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

function matchesEl(el) {
    return el.value === '14' && el.label === '7';
}
Run Code Online (Sandbox Code Playgroud)

或者如果数组的副本没问题(并且从ES5开始可用),那么Array.prototype.filter就是这样的:

var withoutEl = arr.filter(function (el) { return !matchesEl(el); });
Run Code Online (Sandbox Code Playgroud)

  • Upvoted,因为ES6是未来. (20认同)

sup*_*ary 28

身份解决方案

如果你有对象的身份不只是反对平等(即你试图从阵列中删除特定对象,其中包含了相同的数据,现有的对象,而不是一个对象),你可以做到这一点很简单地拼接和的indexOf:

a = {x:1}
b = {x:2}
arr = [a,b]
Run Code Online (Sandbox Code Playgroud)

假设您要删除b:

arr.splice(
  arr.indexOf(b), 1
);
Run Code Online (Sandbox Code Playgroud)

平等解决方案

这个问题使人们不清楚我们是在处理身份还是平等问题.如果你有相等(两个对象包含相同的东西,看起来彼此相同,但实际上不是同一个对象),你需要一个小比较函数,我们可以传递给findIndex.

a = {x: 1};
b = {x: 2};
arr = [a, b];
Run Code Online (Sandbox Code Playgroud)

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

c = {x: 1}

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

if (index !== -1) {
  arr.splice(
    index, 1
  );
}    
Run Code Online (Sandbox Code Playgroud)

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

除非您只为常青浏览器编写文章,否则您可能希望使用像Babel这样的转换程序来使用此解决方案.

具有不变性的解决方案

如果您关心不变性,并且想要返回一个新数组,则可以使用filter进行:

a = {x: 1};
b = {x: 2};
arr = [a, b];
Run Code Online (Sandbox Code Playgroud)

让我们保留一切不是:

newArr = arr.filter((x) => x != a)
Run Code Online (Sandbox Code Playgroud)


Edg*_*zco 14

尝试:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

演示