【问题标题】:How to remove a specific Object from an array of Objects, by object's property?如何通过对象的属性从对象数组中删除特定对象?
【发布时间】:2015-04-08 02:49:44
【问题描述】:

给定数组 [{GUID, other properties}, ...],

如何通过其 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);

此处显示:How do I remove a particular element from an array in JavaScript?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

这应该适用于所有浏览器:

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');

【讨论】:

    【解决方案2】:

    我会推荐使用Array.prototype.filter 函数,像这样

    game.data.collectedItems = game.data.collectedItems.filter(function(currentObj){
        return currentObj.GUID !== entityObj["GUID"];
    });
    

    这将遍历game.data.collectedItems 的元素并过滤掉函数作为参数传递的项目,返回false。在您的情况下,所有对象都将返回true,但GUIDentityObj["GUID"] 匹配的对象除外。

    注意:由于filter创建了一个新的数组,我们需要用新的数组对象替换旧的数组对象。这就是我们将filter 的结果分配回game.data.collectedItems 的原因。

    【讨论】:

    • 这太棒了。感谢您解释它是如何工作的。虽然在某些时候使用对象属性从数组拼接会很酷。
    • @Growler 实际上,首先您需要找到数组中项目的索引(如您所想,这在您的情况下并不直接),然后您需要使用splice。这就是为什么我推荐filter。只需抛弃旧数组并构建一个没有您不想要的元素的新数组:-)
    • 我正在改变我的问题,只将实体对象添加到数组中,而不是 {GUID,实体对象}。之后,我想相应地改变你的答案:)
    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2018-10-03
    • 2016-07-26
    • 1970-01-01
    • 2021-01-30
    • 2021-09-11
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多