[英]Remove object from array based on array of some property of that object
我有一個對象數組(objList),每個對象都有“id”屬性。
我有一個字符串數組 (idsToRemove),表示要從 objList 中刪除的對象的 ID。
我找到了一些解決方案,但我擔心它很慢,尤其是對於具有很多屬性的大量對象。 有沒有更有效的方法來做到這一點?
var idsToRemove = ["3", "1"]; var objList = [{ id: "1", name: "aaa" }, { id: "2", name: "bbb" }, { id: "3", name: "ccc" } ]; for (var i = 0, len = idsToRemove.length; i < len; i++) { objList = objList.filter(o => o.id != idsToRemove[i]); } console.log(objList);
打開idsToRemove
成Set
,這樣就可以使用Set.prototype.has
(一個O(1)
操作), .filter
的objList
只有一次,讓整體復雜度為O(n)
和你只遍歷一次可能是巨大的objList
):
var idsToRemove = ["3", "1"]; var objList = [{ id: "1", name: "aaa" }, { id: "2", name: "bbb" }, { id: "3", name: "ccc" } ]; const set = new Set(idsToRemove); const filtered = objList.filter(({ id }) => !set.has(id)); console.log(filtered);
請注意, Array.prototype.includes
和Array.prototype.indexOf
操作是O(N)
,而不是O(1)
,因此如果您使用它們而不是Set
,它們可能需要更長的時間。
您可以使用Array.includes
來檢查給定的字符串是否存在於給定的數組中,並將其與Array.filter
。
const idsToRemove = ['3', '1']; const objList = [{ id: '1', name: 'aaa', }, { id: '2', name: 'bbb', }, { id: '3', name: 'ccc', }, ]; const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id)); console.log(filteredObjList);
如果使用內置查找函數,則不需要兩個嵌套迭代器
objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);
文檔:
只需使用Array.filter()
const idsToRemove = ['3', '1']; const objList = [{ id: '1', name: 'aaa', }, { id: '2', name: 'bbb', }, { id: '3', name: 'ccc', } ]; const res = objList.filter(value => !idsToRemove.includes(value.id)); console.log("result",res);
我已經為此類問題創建了NPM軟件包
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.