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