簡體   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