【问题标题】: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)
    }
  }
}

【问题讨论】:

    标签: javascript arrays search duplicates javascript-objects


    【解决方案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>可以运行的比较次数”
    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2021-04-17
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多