如何使用reduce计算多个数组的交集?

4

例子:

myArray = [[1,2,3,4],
           [2,3,4,5], 
           [3,4,5,6]
          ];

期望输出:

newArray = [3,4]

如何生成一个新数组,其中包含所有三个数组中存在的值?


你想使用 reduce 是因为你认为这是正确的方法,还是因为你想学习如何使用它? - user9315861
我确实想了解这种方法。我不知道是否有更有效的方法来解决这个问题。 - mauabe
如果你只是想理解reduce,那么一个真正具有挑战性的版本是使用reduce没有其他数组方法来解决这个问题。 - user9315861
2个回答

3

在缩减的同时,返回累加器与当前迭代的子数组的交集:

const myArray = [[1,2,3,4], [2,3,4,5], [3,4,5,6]];
const intersection = myArray.reduce((a, arr) => (
  a.filter(num => arr.includes(num))
));
console.log(intersection);


“a.filter(num => arr.includes(num))” 不是更好吗?如果其中一个数组有一百万个项目,你的代码性能会很差。 - user9315861
你说得对,过滤较小的数组会更高效,但在这里几乎肯定不重要。 - CertainPerformance

3
你可以使用.filter()来提取匹配的值:

let myArray = [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]];

let intersect = ([f, ...r]) => f.filter(v => r.every(a => a.includes(v)));

console.log(intersect(myArray));


1
个人而言,我认为通过默认值参数“偷偷摸摸”引入新变量fr的风格令人不悦。然后,在使用它作为第二个参数的默认值之后,您甚至不再使用a。为什么不直接写成let intersect = ([f, ...r]) => ...?除此之外,只要您假设OP想要使用reduce只是一个建议,那么这是一个很好的解决方案。 - user9315861
非常感谢@torazaburo。你说得完全正确。我已经更新了我的答案,同时也学到了新的东西 :) - Mohammad Usman
@torazaburo 我想问你一个问题。你之前的SO账户发生了什么事情?如果我没记错的话,你之前在这里有一个非常棒的个人资料。 - Mohammad Usman

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