如何使用 lodash 比较两个数组(顺序很重要)



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

我怎样才能做到这一点?

您可以在 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>

您可以并行迭代这两个数组,并将它们排序为两个单独的集合:

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

这也可以用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))

从预设的累加器对象开始,并使用索引比较每个数组值。

你可以从 lodash 使用 xor,如果数组具有相同的元素,它将返回一个空数组。

const a1= ['a', 'b', 'd']
const a2= ['d', 'b', 'a']

_.xor(a1, a2).length;//0

你为什么不编写自己的实用程序函数来检查序列的相等性?像这样:

export function sequenceEqual<T>(firstSequence: T[], secondSequence: T[]): boolean {
if(!firstSequence || !secondSequence) return false;
return firstSequence.every(
(d, i) => d === secondSequence[i]
);
}

这样,您可以只返回布尔值。无需执行额外的步骤来检查代码是否返回了一些数组或数字或其他什么,返回类型的长度是多少,它是哪个数字等。你只要问我的序列是否相等,是真是假。

另一个好处是你不依赖于某些库。除非他们有 sequenceEqual,这样你就不必从头开始编写,就叫它吧,但我在 Lodash 中还没有找到它。

最新更新