javascript - 过滤对象数组以仅显示自上次过滤后添加的那些对象的最佳方法是什么?

标签 javascript arrays object data-structures

我的第一个函数在我的雇主网站上抓取已完成任务的用户列表,并输出一个包含结果的 json 文件。 json文件组织如下:

{"Completed":[{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"},{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"}...]}

我的第二个函数使用前面提到的 json 文件自动生成收据。再次调用这两个函数时,我想省略所有以前使用的数据,只为不在任何先前调用结果中的任务生成收据,从而避免生成重复项。

我试图通过第二个数组的元素来过滤第一个数组,但据我所知,您不能比较对象,甚至不能比较数组。这是我尝试根据需要调整的功能:

let myArray = myArray.filter( ( el ) => !toRemove.includes( el ) );

我希望我的用例并不少见,并且在这种情况下已经有大量关于最佳实践的经验。我更喜欢只使用 javascript 的解决方案,这样我就可以了解将来如何更好地应对这种情况。但是,如果您也有欢迎的库/模块解决方案。提前致谢。

最佳答案

问题是两个对象永远不相等(除非它们是对同一对象的引用)。要检查结构是否相等,您必须手动比较它们的属性:

  myArray.filter(el => !toRemove.some(el2 => el.task === el2.task && el.name === el2.name));

虽然这行得通,但是当您将 myArray 的每个对象与 toRemove 的所有对象进行比较时,对于很多元素来说它会非常慢。为了改进这一点,您可以从属性中生成一个唯一的散列并将该散列添加到一个集合中:

  const hash = obj => JSON.stringify([obj.name, obj.task]);

  const remove = new Set(toRemove.map(hash));

  const result = myArray.filter(el => !remove.has(hash(el)));

这将是 O(n + m),而之前的解决方案是 O(n * m)。

关于javascript - 过滤对象数组以仅显示自上次过滤后添加的那些对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045667/

相关文章:

java - 如果温度对象表示低于冰点的温度,则返回 true 的方法(JAVA)

c++ - 为什么每次成功的 QueryInterface() 调用之后都是 Release() 调用?

javascript - Lightbox_Me 淡出效果

javascript - 如何将 HTML 附加到 div,同时仍然允许监听器工作?

javascript - 尝试在函数中使用参数时出错

c# - 将一个字符串数组复制到另一个

javascript - Durandal,可观察的非单例模块,无需显式使其成为可观察的

java - 我怎样才能用数组替换我代码中的 ArrayList 并且它仍然有效?

ruby - 如何过滤数组中的元素?

c++ - 在 C++ 中使用静态函数,我的教授希望我告诉 main 哪个对象具有最高优先级而不传递任何内容