2015-02-08 310 views
3

给定数组[{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); 

如下所示: How do I remove a particular element from an array in JavaScript?

+0

http://stackoverflow.com/questions/6485127/how-to-delete-unset-the-properties-of-a-javascript-object – 2015-02-08 07:20:13

+0

HTTP ://stackoverflow.com/questions/1596782/how-to-unset-a-javascript-variable – 2015-02-08 07:20:43

+0

http://stackoverflow.com/questions/208105/how-to-remove-a-property-from-a-javascript -object – 2015-02-08 07:21:04

回答

1

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

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

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

注意:由于filter创建一个新的数组,我们需要用旧的数组对象替换旧的数组对象。这就是为什么我们将filter的结果返回到game.data.collectedItems

+0

这太棒了。感谢解释它是如何工作的。虽然在某个时候使用对象属性从数组中拼接会很酷。 – Growler 2015-02-08 07:26:44

+1

@Growler实际上,首先你需要找到数组中项目的索引(你认为它并不是直截了当的),然后你需要使用'splice'。这就是为什么我推荐'filter'。简单地抛弃旧的数组,并构建一个没有你不想要的元素的新数组:#) – thefourtheye 2015-02-08 07:30:03

+0

我改变我的问题,只添加实体对象到数组,而不是{GUID,实体对象}。之后,我猜想改变你的答案:) – Growler 2015-02-08 07:37:03

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