2013-03-08 99 views
119

我有對象的這樣一個數組:刪除數組元素基於對象屬性

var myArray = [ 
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money} 
]; 

如何刪除基於其特性的特定的一個?

例如我將如何刪除數組對象與'錢'作爲字段屬性?

回答

177

一種可能性:

myArray = myArray.filter(function(obj) { 
    return obj.field !== 'money'; 
}); 

請注意:filter創建新的數組。儘管您使用新引用更新了原始變量myArray,但引用原始數組的任何其他變量都不會獲得過濾的數據。謹慎使用。

+5

請注意'filter()'確實只適用於Internet Explorer 9+ – jessegavin 2013-04-29 14:51:07

+0

@jessegavin。我應該提到有很多好的* es5 shim *庫可用,它們可以模擬這些功能(只是爲了支持傳統瀏覽器) – jAndy 2013-04-29 14:57:15

+2

'filter()'創建一個新數組,這很好,如果你能夠重新分配變量並且知道沒有其他代碼引用它的區域。如果您特別需要修改原始數組對象,這將不起作用。 – 2014-09-26 17:55:29

52

遍歷整個數組,並splice出你不想要的。爲了方便使用,迭代向後所以你不必顧及陣列的活性質:

for (var i = myArray.length - 1; i >= 0; --i) { 
    if (myArray[i].field == "money") { 
     myArray.splice(i,1); 
    } 
} 
+1

你是什麼意思的陣列的生活性質? @Neit暗Absol – sisimh 2015-06-01 12:46:10

+20

@sisimh他的意思是說,如果你通過使用長度作爲迭代邏輯的一部分來迭代數組,並且由於它的元素已被刪除或添加,它的長度會發生變化,那麼最終可能會從數組末尾運行或者不對數組中的每個項目進行操作。向後移動使得它不太可能,因爲它向靜態0索引而不是移動長度工作。 – Klors 2015-07-10 16:14:59

+1

感謝您的解釋@ Klors :) – sisimh 2015-07-12 13:19:05

1

jAndy的解決方案可能是最好的,但如果你不能依靠過濾器,你可以這樣做:如果你不使用jQuery

var myArray = [ 
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"} 
]; 

myArray.remove_key = function(key){ 
    var i = 0, 
     keyval = null; 
    for(; i < this.length; i++){ 
     if(this[i].field == key){ 
      keyval = this.splice(i, 1); 
      break; 
     } 
    } 
    return keyval; 
} 
+1

爲什麼不我能夠依靠filter()? – imperium2335 2013-03-08 06:48:28

+2

因爲它是JavaScript 1.6的一部分,IE8和以下版本或舊版瀏覽器不支持它。 – 2013-03-08 07:01:19

3

以下是代碼。 Demo

var myArray = [ 
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'} 
]; 

alert(myArray.length); 

for(var i=0 ; i<myArray.length; i++) 
{ 
    if(myArray[i].value=='money') 
     myArray.splice(i); 
} 

alert(myArray.length); 

您還可以使用具有許多功能的下劃線庫。

Underscore是JavaScript的一個實用工具,帶庫,提供了很多功能的編程支持

+3

這是一個離開網絡的非常危險的例子......它可以與示例數據一起使用,但不能與其他任何東西一起使用。 splice(i)意味着它將刪除數組中第一個實例的所有元素,其中第一個實例的值爲金錢,而第二個實例的值不滿足op的要求。如果我們更改爲splice(i,1),它仍然是不正確的,因爲它不會評估下一個順序項目(您將不得不減少i)這就是爲什麼您應該向後處理數組中的刪除操作,以便刪除項目不會更改要處理的下一個項目的索引 – 2016-08-01 00:46:28

7

的下面是使用jQuery的grep另一種選擇。通過true作爲確保grep的第三個參數將刪除與您的功能匹配的項目。

users = $.grep(users, function(el, idx) {return el.field == "money"}, true) 

如果您已經使用jQuery那麼就不需要墊片,這是相對於使用Array.filter可能是有用的。

4

您可以使用lodash的findIndex來獲取特定元素的索引,然後使用它進行拼接。

myArray.splice(_.findIndex(myArray, function(item) { 
    return item.value === 'money'; 
}), 1); 
+0

什麼是數組是樹結構? – forgottofly 2017-01-18 11:34:11

+0

@forgottofly樹結構?我認爲'myArray'是一個對象數組。 – Sridhar 2017-01-18 12:17:37

+1

如果數組是一個樹結構var beforeDeleteOperationArray = [{「id」:3.1,「name」:「test 3.1」,「activityDetails」:[{「id」:22,「name」:「test 3.1」}) ,{「id」:23,「name」:「changed test 23」}]}]我想刪除id:23 – forgottofly 2017-01-18 13:59:15

2
var myArray = [ 
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money} 
]; 
console.log(myArray.length); //3 
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true); 
console.log(myArray.length); //2 

元件陣列中的一個對象。 第三個參數true意味着將返回一個元素數組,其失敗了你的函數邏輯,false意味着將返回一個元素數組,失敗你的函數邏輯。

+1

您的解決方案非常清晰。謝謝 – 2017-06-06 15:24:46