簡體   English   中英

如何獲得兩個數組之間的差異?

[英]How to get the difference between two arrays?

我有2個數組:

arr1 = [[11,12],[11,13],[11,14], [12,13]];
arr2 = [[11,13],[11,14]];

預期結果[[11,12],[12,13]]

我怎樣才能得出兩個數組之間的區別? 我使用lodash _.difference但它給了我一個錯誤的答案。

您需要使用_.differenceWith() ,因為您需要比較子數組的元素。 默認情況下,它只是測試子數組是否是相同的對象,它們可能不是。

result = _.differenceWith(arr1, arr2, _.isEqual);

僅使用javascript,僅適用於此類似示例

var a1 = [[11,12],[11,13],[11,14], [12,13]];
var a2 = [[11,13],[14,11]];
var a3 = a1.filter(ar1 => !a2.some(ar2 => ar1.every(n1 => ar2.includes(n1))))
console.log(a3); // [[11,12],[12,13]]

創建通用解決方案的標准太多。

例如,[11,12]與[12,11]相同,可能只對同一數組的引用相同, (ar1 === ar2)true 如果同一個陣列中有兩個相同的條目而另一個中有一個相同的條目,你會過濾掉一個,還是保留它? 問題的數量可以持續一段時間,嵌套越深,數組中存儲的類型數越多,問題就越嚴重。

 var a1 = [[11,12],[11,13],[11,14], [12,13]] var a2 = [[11,13],[14,11],[12,14]]; a3 = []; [[a1,a2],[a2,a1]].forEach(a=>{ a3.push(...a[0].filter( ar1 => !a[1].some( ar2 => ar1.every( n1 => ar2.includes(n1) ) ) )) }); console.log("[["+a3.join("], [")+"]]") 

你可以不用lodash做到這一點。 提示應該將子陣列映射到字符串中以便於比較

 var arr1 = [[11,12],[11,13],[11,14], [12,13]]; var arr2 = [[11,13],[11,14],[12,14]]; var res = arr1.concat(arr2).map(x => x.join(",")).filter((x,i,arr) => arr.indexOf(x) === arr.lastIndexOf(x)).map(x => x.split(",")); console.log(res); 

只需幾行純JS即可完成這種分離(聯合)工作。 此外,你應該確保檢查兩個陣列而不是另一個。

 var arr1 = [[11,12],[11,13],[11,14],[12,13]], arr2 = [[11,13],[11,14],[12,14]]; res = arr1.reduceRight((p,c,i,a) => { var fi = p.findIndex(s => c.every(n => s.includes(n))); return fi !== -1 ? (a.splice(i,1), p.splice(fi,1), p) : p; },arr2) .concat(arr1); console.log(res); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM