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
我该如何实现?
答案 0 :(得分:1)
您可以并行迭代两个数组,然后将它们分为两个单独的集合:
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]);
答案 1 :(得分:1)
您可以在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>
答案 2 :(得分:1)
这也可以用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))
从预设的累加器对象开始,然后使用索引比较每个数组值。
答案 3 :(得分:1)
为什么不编写自己的实用程序函数来检查序列的相等性?类似的东西:
export function sequenceEqual<T>(firstSequence: T[], secondSequence: T[]): boolean {
if(!firstSequence || !secondSequence) return false;
return firstSequence.every(
(d, i) => d === secondSequence[i]
);
}
这样你就可以只返回布尔值。不需要执行额外的步骤来检查代码是否返回了某个数组或数字或其他任何东西,返回类型的长度是多少,它是哪个数字等等。您只需询问我的序列是否相等并得到真假。< /p>
另一个好处是您不依赖于某些库。除非他们有sequenceEqual 这样你就不必从头开始编写,只需调用它,但我在Lodash 中找不到它。
答案 4 :(得分:-1)
您可以使用 lodash 中的 xor,如果数组具有相同的元素,它将返回一个空数组。
const a1= ['a', 'b', 'd']
const a2= ['d', 'b', 'a']
_.xor(a1, a2).length;//0