刪除所有特定對象:從給定數組的數組
myArr = [
{'a':1},
{'b':1},
{'b':2},
{'a':1},
{'b':2}
]
和索引0
,其中有對象{'a':1}
,我想找回陣列: [{'b':1},{'b':2},{'b':2}]
保持原來的排序順序。
即刪除索引0
中的對象和所有其他等效的對象。 有沒有一種優雅的方式?
刪除所有特定對象:從給定數組的數組
myArr = [
{'a':1},
{'b':1},
{'b':2},
{'a':1},
{'b':2}
]
和索引0
,其中有對象{'a':1}
,我想找回陣列: [{'b':1},{'b':2},{'b':2}]
保持原來的排序順序。
即刪除索引0
中的對象和所有其他等效的對象。 有沒有一種優雅的方式?
如果你想刪除相同的對象,這很簡單:
a1 = { a: 1 }
b1 = { b: 1 }
b2 = { b: 2 }
myArr = [ a1, b1, b2, a1, b2 ]
var filtered = myArr.filter(o => o != a1)
console.log(filtered);
// [ {b: 1}, {b: 2}, {b: 2} ]
但是,如果要刪除等效對象,則會變得複雜,因爲默認情況下JavaScript不具有對象等價性測試。您可以自己實現一個,或依靠像lodash庫之一:,
var myArr = [
{'a':1},
{'b':1},
{'b':2},
{'a':1},
{'b':2}
];
var filtered = _.filter(myArr, o => !_.isEqual(o, {a: 1}));
console.log(filtered);
// [ {b: 1}, {b: 2}, {b: 2} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>
話又說回來,如果你正在使用lodash,你可能也只是用它來充分程度:
var myArr = [
{'a':1},
{'b':1},
{'b':2},
{'a':1},
{'b':2}
];
var filtered = _.differenceWith(myArr, [{a: 1}], _.isEqual);
console.log(filtered);
// [ {b: 1}, {b: 2}, {b: 2} ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>
基本上不相同的東西,但更易讀一點。
@Rajesh:我已經在上面解釋過,這與您發佈的鏈接完全不同。請停止。 – Amadan
@Rajesh:如果'{a:1}'「和其他所有」相同「值的對象都被刪除,爲什麼要刪除'{a:1,b:2}? 「{a:1}」與「{a:1,b:2}」的值不同。「刪除等價對象」和「基於屬性刪除元素」是兩個不同的問題; OP的意圖非常明確。 – Amadan
@Rajesh _「但是OP仍然在尋找一種過濾數組的方法,如果有一個對象'{a:1,b:2}',那麼即使這樣也應該被移除」_這不是問題的要求是。 OP不要求刪除'b:2'。 _「和索引0,它有對象'{'a':1}',我想返回數組:'[{'b':1},{'b':2},{' b':2}]'保持原來的排序順序。「OP在哪裏描述刪除'b:2'? – guest271314
嘗試myArr.shift();
它將返回{'a':1}
而且myArr,該會[{'b':1},{'b':2},{'b':2}]
這對我的作品
myArr = [
{'a':1},
{'b':1},
{'b':2},
{'a':1},
{'b':2}
]
//Get first item
for(var key in myArr[0]){
var firstItem = key;
}
alert('First item: ' + firstItem);
//Remove matches
var removedItems = []; //Not needed, just used to show you what it's removing.
myArr.forEach(function(item){
for (var key in item){
if(key == firstItem){
removedItems.push(key); //Not needed
myArr.splice(item, 1); //Remove the array entry
}
}
});
alert('Removed items: ' + removedItems);
你怎麼知道哪個對象刪除?你會傳遞一個引用來刪除或某些值,如數組索引,例如? – nem035
@ nem035我解釋了一下。 thx –
可能重複[Javascript:如何根據屬性過濾對象數組?](http://stackoverflow.com/questions/2722159/javascript-how-to-filter-object-array-based-on-attributes) – Rajesh