从具有相同属性的数组中查找和删除对象

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>可以运行的比较次数”

以上是关于从具有相同属性的数组中查找和删除对象的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除重复的对象

从过滤数组和主数组中删除相同的对象

如何从一个数组中获取具有其他相同属性的对象?

如何将具有相同属性的对象合并到一个数组中?

如何将具有相同属性的所有字典从数组中获取到新数组?

如何删除具有相同属性值但在 NSMutableArray 中有一个的所有对象