Javascript 获取具有相同对象的数组之间的差异

Javascript 获取具有相同对象的数组之间的差异,javascript,arrays,Javascript,Arrays,我有两个数组,如下所示: var a = [ {id: 1}, {id: 2}, {id: 1}, {id: 3} ]; var b = [ {id: 1}, {id: 3} ]; 我想得到数组a有而数组b没有的元素。预期结果是: [ {id: 1}, {id: 2} ] 我试过这个: a.filter(x => b.indexOf(x) == -1); 这是: a.filter(x => new Set(b).has(x) == false); 这

我有两个数组,如下所示:

var a = [
    {id: 1}, {id: 2}, {id: 1}, {id: 3}
];

var b = [
    {id: 1}, {id: 3}
];
我想得到数组
a
有而数组
b
没有的元素。预期结果是:

[
    {id: 1}, {id: 2}
]
我试过这个:

a.filter(x => b.indexOf(x) == -1);
这是:

a.filter(x => new Set(b).has(x) == false);
这两行代码的问题是,它将数组A中的
{id:2}
和数组B中的
{id:2}
视为不同的对象,因此这两行代码只返回完整的数组A

另一个困难是,我需要将
{id:1}
{id:1}
视为两个不同的对象,即使它们内部具有完全相同的属性和值


在我的实际代码中,我有更复杂、属性更多的对象,但情况是一样的。

您可以获取一个集合并返回过滤后的数组,而不返回集合id的值

var a=[{id:1},{id:2},{id:1},{id:3}],
b=[{id:2},{id:3}],
s=新集合(b.map(({id})=>id)),
结果=a.filter({id})=>!s.has(id));

控制台日志(结果)我最终实现了这一目标:

function differenceOf(arr1, arr2) {
  var differences = $.extend(true, [], arr1); // creates clone
  var arr2Duplicate = $.extend(true, [], arr2);
arr2Loop:
  for(var i = 0; i < arr2Duplicate.length; i++) {
      var obj2 = arr2Duplicate[i];
      if(obj2 == null) continue;
differencesLoop:
      for(var j = 0; j < differences.length; j++) {
          var obj1 = differences[j];
          if(obj1 == null) continue;
          if(obj1.id == obj2.id) {
            differences.splice(j, 1);
            arr2Duplicate.splice(i, 1);
            i = -1;
            j = -1;
            break differencesLoop;
          }
      }
  }
  return differences;
}
函数差异(arr1、arr2){
变量差异=$.extend(true,[],arr1);//创建克隆
var arr2dupplicate=$.extend(true,[],arr2);
arr2Loop:
对于(变量i=0;i
我克隆了这两个数组以备将来操作,因此引用将被删除,原始数组不会受到影响。我将第一个数组设置为
differences
数组,以便删除出现在另一个数组中的元素

我遍历第二个数组,然后在该循环中遍历第一个数组。然后,我检查是否有相同的ID;如果是这样,那么我在两个数组中都找到了一个元素,所以我只需将它从第一个数组中删除。我还从第二个数组中删除该元素以防止重复比较,然后中断循环以防止删除更多具有相同ID的元素

当我移除元素时,循环仍在继续,最终它将到达元素原来所在的空槽,因此我检查它是否为null;如果是这样,跳过并继续

两个循环结束后,我将看到一个数组,该数组中的元素不同,而不管元素的属性是否相同

编辑:我将jQuery each循环更改为standard for循环,因为当我尝试中断内部循环时,它也中断了外部循环。我通过添加GOTO标签解决了这个问题,解决了断裂问题


当我检测到重复时,我也会将索引重置回-1,因为当循环继续时,索引将增加并跳过对象,从而导致不正确的数据。我将其重置为-1,这样当代码块完成时,它将增加回0,并再次扫描阵列。

@RolandStarke编辑以更改我面临的场景,您的代码不起作用。您从哪里知道哪个对象是共享对象?@NinaScholz如果您问我如何知道阵列中哪些对象是重复的,我不知道。我怎么会知道呢?@NinaScholz我不知道,还在想。为了改变我面临的情况,你的代码不起作用。