如何通过对象属性从对象数组中移除特定对象?

8

给定数组 [{GUID,其他属性}, ...],

我如何通过其GUID(或任何对象属性)从JavaScript数组中删除特定对象?

我试图使用splice()

var index = game.data.collectedItems.indexOf(entityObj.GUID);
if (index > -1) {
    game.data.collectedItems.splice(index, 1);
}

这行代码不能正常工作,因为我无法直接识别数组中的值, 如下所示:
var array = [2, 5, 9];
var index = array.indexOf(5);

这里展示了一个问题:如何在JavaScript中从数组中删除特定的元素?

https://dev59.com/qGw15IYBdhLWcg3wo9Rx - Samuel Cook
https://dev59.com/jXI-5IYBdhLWcg3w9tdw - Samuel Cook
https://dev59.com/5nVC5IYBdhLWcg3wsTfv - Samuel Cook
@SamuelCook 谢谢你提供这些参考资料,但我不确定它们是否涵盖了我所需要的内容。 - user3871
2个回答

1
我建议使用Array.prototype.filter函数,像这样:
game.data.collectedItems = game.data.collectedItems.filter(function(currentObj){
    return currentObj.GUID !== entityObj["GUID"];
});

这将遍历game.data.collectedItems的元素,并过滤掉函数作为参数返回false的项目。在您的情况下,除了GUID与entityObj["GUID"]匹配的对象外,所有对象都将返回true注意:由于filter创建一个新数组,我们需要用新数组对象替换旧数组对象。这就是为什么我们将filter的结果指定回game.data.collectedItems的原因。

这太棒了。感谢您对其工作原理的解释。不过,有一天使用对象属性从数组中拼接会很酷。 - user3871
1
@Growler 实际上,您首先需要找到数组中该项的索引(在您的情况下并不直接),然后您需要使用 splice。这就是为什么我推荐使用 filter。只需放弃旧数组并构造一个新数组,其中不包含您不想要的元素即可 :-) - thefourtheye
我正在修改我的问题,只将实体对象添加到数组中,而不是{GUID,实体对象}。之后,我猜您需要相应地更改您的答案 :) - user3871

0

这应该在所有浏览器上都能正常工作:

function withoutPropVal(ary, propVal){
  var a = [];
  for(var i=0,l=ary.length; i<l; i++){
    var o = ary[i], g = 1;
    for(var n in o){
      if(o[n] === propVal)g = 0;
    }
    if(g)a.push(o);
  }
  return a;
}
var newArray = withoutPropVal(yourArray, 'Object Property Value to Leave those Objects Out Here');

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