繁体   English   中英

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

[英]Get difference between arrays with same objects

我有两个数组,像这样:

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);

与这两个问题是,它对待{id: 2}从阵列A和{id: 2}从阵列B中不同的对象,所以这些代码两行简单地返回完整的阵列A.

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

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

您可以获取一个集合并返回不包含集合ID值的过滤数组。

 var a = [{ id: 1 }, { id: 2 }, { id: 1 }, { id: 3 }], b = [{ id: 2 }, { id: 3 }], s = new Set(b.map(({ id }) => id)), result = a.filter(({ id }) => !s.has(id)); console.log(result); 

我最终得到了这个工作:

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;
}

我克隆了这两个数组以备将来操作,因此将删除引用,并且不会影响原始数组。 我将第一个数组设置为differences数组,因此可以删除出现在另一个数组中的元素。

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

当我删除元素时,循环仍在进行,最终它将到达该元素以前所在的空插槽,因此我检查它是否为null。 如果是这样,请跳过并继续前进。

在两个循环结束之后,我将获得一个数组,该数组具有不同的元素,而与具有相同属性的元素无关。

编辑 :我将jQuery每个循环更改为标准的循环,因为当我尝试突破内循环时,它也脱离了外循环。 我通过添加这些GOTO标签解决了这一问题,从而解决了该问题。

当我检测到重复项时,我还将索引重新设置为-1,因为当循环继续进行时,索引将增加并跳过对象,从而导致数据不正确。 我将其重置为-1,以便当代码块完成时,它将递增回0,并再次扫描阵列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM