从具有相同属性的数组中查找和删除对象
Posted
技术标签:
【中文标题】从具有相同属性的数组中查找和删除对象【英文标题】:Find and Remove Objects from Array with Identical Property 【发布时间】:2021-07-17 20:04:45 【问题描述】:我有两个对象数组,一个有大约。 1800 项,第二项约。 600 项。每个数组中的数据示例:
let exampleArray = [ID:X2346,NAME:"someName",ID:X8847,NAME:"someName2",...]
我需要比较两个数组,如果大数组中某个对象的“ID”值等于较小数组中某个对象的 ID 值,则将该对象从较大数组中完全删除,或者离开较大的数组仅包含基于属性“ID”的较小数组中不存在的对象。
我已经使用两个嵌套的 for 循环来完成此操作,并且它可以工作,但我正在尝试提高速度。我已经阅读了哈希表,但我认为它不适用于这种情况,或者我不完全理解如何使用它们。有没有更快的方法来实现我的目标?
for (let x=0;x<largeArray.length;x++)
for (let y=0;y<smallerArray.length;y++)
if(largeArray[x]['ID']===smallerArray[y]['ID'])
largeArray.splice(x,1)
【问题讨论】:
【参考方案1】:您可以将小数组中的所有ID映射为Array.prototype.map()
:
const idsFilter = smallArray.map(item => item.ID);
然后你可以使用它从大数组中过滤掉ID包含在idsFilter
中的项目,使用Array.prototype.filter()
:
const filteredLargeArray = largeArray.filter(item => !idsFilter.includes(item.ID));
【讨论】:
谢谢!刚刚测试了几次,你的方法确实快得多。据我所知,为什么 map/filter 方法更快?我认为在引擎盖下,地图和过滤器都以某种方式遍历数组? 我认为性能上的主要差异是因为Array.prototype.includes()
在找到匹配项后立即返回,而嵌套的for
循环即使找到匹配项并删除也会继续运行它;换句话说,您的代码将始终运行 largeArray.length
x smallArray.length
比较(大约 1,080,000 次比较)[...继续...]
[...] 而对于 Array.prototype.includes()
,这只是将要运行的 最大 次比较,因为当找到匹配项时,代码将跳过比较与所有其他 ID 相同的项目并移至下一个项目。
...我写了“这只是将要运行的最大比较次数”但我的意思是“这只是最大 i>可以运行的比较次数”以上是关于从具有相同属性的数组中查找和删除对象的主要内容,如果未能解决你的问题,请参考以下文章