簡體   English   中英

根據該對象的某些屬性的數組從數組中刪除對象

[英]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);

打開idsToRemoveSet ,這樣就可以使用Set.prototype.has (一個O(1)操作), .filterobjList只有一次,讓整體復雜度為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.includesArray.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.prototype.indexOf()

Array.prototype.includes()

只需使用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軟件包

請參考: -https : //www.npmjs.com/package/array-refactor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM