[英]How to compare two arrays using lodash (the order matters)
var arr1=[3,4,5,6,7,1,9]; var arr2=[1,3,4,6,7,5,9];
我想比較 arr2 和 arr1。 但是方法difference()
和intersection()
似乎只能找到兩個數組是否具有相同的元素。 我想逐點比較兩個數組,例如 arr1[0] 到 arr2[0]、arr1[1] 到 arr2[1]。 它應該顯示:
intersection: 6,7,9
difference: 1,3,4,5
我怎樣才能做到這一點?
您可以並行迭代兩個數組並將它們排序為兩個單獨的集合:
function* parallel(a, b) {
for(let i = 0; i < a.length || i < b.length; i++)
yield [ a[i], b[i] ];
}
const intersection = new Set,
difference = new Set;
for(const [a, b] of parallel(arr1, arr2)) {
if(a === b)
intersection.add(a);
else
difference.add(a).add(b);
}
console.log([...intersection], [...difference]);
您可以在 lodash 中通過壓縮兩個數組、過濾並獲取每對中的最后一項來完成此操作。 交集的比較器是該對相等。 差異的比較器是該對不相等。
const arr1 = [3,4,5,6,7,1,9]; const arr2 = [1,3,4,6,7,5,9]; const compare = (comperator) => (arr1, arr2) => _.zip(arr1, arr2) .filter(comperator) .map(_.last); const eq = _.spread(_.eq); const intersection = compare(eq); const difference = compare(_.negate(eq)); console.log('intersection ', intersection(arr1, arr2)); console.log('difference ', difference(arr1, arr2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
這也可以通過reduce
解決:
var arr1 = [3, 4, 5, 6, 7, 1, 9]; var arr2 = [1, 3, 4, 6, 7, 5, 9]; const f = (a, b) => b.reduce((r,c,i) => (a[i] == c ? r.intersection.push(c) : r.difference.push(c), r), {intersection: [], difference: []}) console.log(f(arr1, arr2))
從預先設置的累加器對象開始,並使用索引比較每個數組值。
為什么不編寫自己的實用程序函數來檢查序列的相等性? 就像是:
export function sequenceEqual<T>(firstSequence: T[], secondSequence: T[]): boolean {
if(!firstSequence || !secondSequence) return false;
return firstSequence.every(
(d, i) => d === secondSequence[i]
);
}
這樣你就可以只返回布爾值。 沒有必要執行額外的步驟來檢查代碼是否返回了某個數組或數字或其他任何東西,返回類型的長度是多少,它是哪個數字等等。您只需詢問我的序列是否相等並得到 true 或 false。
另一個好處是您不依賴於某個庫。 除非他們有sequenceEqual 以便您不必從頭開始編寫,否則只需調用它,但我在Lodash 中找不到它。
您可以使用 lodash 中的 xor ,如果數組具有相同的元素,它將返回一個空數組。
const a1= ['a', 'b', 'd']
const a2= ['d', 'b', 'a']
_.xor(a1, a2).length;//0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.