我有對象的這樣一個數組:刪除數組元素基於對象屬性
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
如何刪除基於其特性的特定的一個?
例如我將如何刪除數組對象與'錢'作爲字段屬性?
我有對象的這樣一個數組:刪除數組元素基於對象屬性
var myArray = [
{field: 'id', operator: 'eq', value: id},
{field: 'cStatus', operator: 'eq', value: cStatus},
{field: 'money', operator: 'eq', value: money}
];
如何刪除基於其特性的特定的一個?
例如我將如何刪除數組對象與'錢'作爲字段屬性?
一種可能性:
myArray = myArray.filter(function(obj) {
return obj.field !== 'money';
});
請注意:filter
創建新的數組。儘管您使用新引用更新了原始變量myArray
,但引用原始數組的任何其他變量都不會獲得過濾的數據。謹慎使用。
遍歷整個數組,並splice
出你不想要的。爲了方便使用,迭代向後所以你不必顧及陣列的活性質:
for (var i = myArray.length - 1; i >= 0; --i) {
if (myArray[i].field == "money") {
myArray.splice(i,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;
}
爲什麼不我能夠依靠filter()? – imperium2335 2013-03-08 06:48:28
因爲它是JavaScript 1.6的一部分,IE8和以下版本或舊版瀏覽器不支持它。 – 2013-03-08 07:01:19
以下是代碼。 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的一個實用工具,帶庫,提供了很多功能的編程支持
這是一個離開網絡的非常危險的例子......它可以與示例數據一起使用,但不能與其他任何東西一起使用。 splice(i)意味着它將刪除數組中第一個實例的所有元素,其中第一個實例的值爲金錢,而第二個實例的值不滿足op的要求。如果我們更改爲splice(i,1),它仍然是不正確的,因爲它不會評估下一個順序項目(您將不得不減少i)這就是爲什麼您應該向後處理數組中的刪除操作,以便刪除項目不會更改要處理的下一個項目的索引 – 2016-08-01 00:46:28
的下面是使用jQuery的grep另一種選擇。通過true
作爲確保grep的第三個參數將刪除與您的功能匹配的項目。
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
如果您已經使用jQuery那麼就不需要墊片,這是相對於使用Array.filter
可能是有用的。
您可以使用lodash的findIndex來獲取特定元素的索引,然後使用它進行拼接。
myArray.splice(_.findIndex(myArray, function(item) {
return item.value === 'money';
}), 1);
什麼是數組是樹結構? – forgottofly 2017-01-18 11:34:11
@forgottofly樹結構?我認爲'myArray'是一個對象數組。 – Sridhar 2017-01-18 12:17:37
如果數組是一個樹結構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
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
意味着將返回一個元素數組,失敗你的函數邏輯。
您的解決方案非常清晰。謝謝 – 2017-06-06 15:24:46
請注意'filter()'確實只適用於Internet Explorer 9+ – jessegavin 2013-04-29 14:51:07
@jessegavin。我應該提到有很多好的* es5 shim *庫可用,它們可以模擬這些功能(只是爲了支持傳統瀏覽器) – jAndy 2013-04-29 14:57:15
'filter()'創建一個新數組,這很好,如果你能夠重新分配變量並且知道沒有其他代碼引用它的區域。如果您特別需要修改原始數組對象,這將不起作用。 – 2014-09-26 17:55:29