gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:34:54 36 4
gpt4 key购买 nike

我的第一个函数在我的雇主网站上抓取已完成任务的用户列表,并输出一个包含结果的 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com