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

3

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

我该如何实现这个目标?

1
isEqual怎么样? - VLAZ
1
什么是问题?您可以迭代和比较。 - Void Spirit
谢谢。但是确定两个数组是否相同并不简单。还需要检查部分相同。 - JackJack
5个回答

2

您可以通过将两个数组进行压缩、过滤,然后获取每对中的最后一项来在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>


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
为什么不编写自己的实用函数来检查序列的相等性?类似这样的东西:
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 中找到它。

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

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


1
如果数组具有相同的元素,您可以使用 lodash 中的 xor 函数,并且它将返回一个空数组。
const a1= ['a', 'b', 'd']
const a2= ['d', 'b', 'a']
 
_.xor(a1, a2).length;//0

这不符合问题要求,因为它必须按顺序进行。 - Jonathan Southern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接