Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';过滤对象数组以仅显示自上次过滤后添加的对象的最佳方法是什么?_Javascript_Arrays_Object_Data Structures - Fatal编程技术网

Javascript 什么';过滤对象数组以仅显示自上次过滤后添加的对象的最佳方法是什么?

Javascript 什么';过滤对象数组以仅显示自上次过滤后添加的对象的最佳方法是什么?,javascript,arrays,object,data-structures,Javascript,Arrays,Object,Data Structures,我的第一个功能是从我的雇主网站上搜索完成任务的用户列表,并输出一个包含结果的json文件。json文件的组织方式如下: {"Completed":[{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"},{"task":"TitleOfTaskAnd01/01/2019", "name":"UsersFullName"}...]} 我的第二个函数使用前面提到的json文件自动生成收据。在再次调用这两个函数时,我想省去以前使用的所有

我的第一个功能是从我的雇主网站上搜索完成任务的用户列表,并输出一个包含结果的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)