[英]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.