JavaScript:使用Reduce()构造一个比较输入数组的函数交集;仅返回相交元素

JavaScript:使用Reduce()构造一个比较输入数组的函数交集;仅返回相交元素,javascript,function,return,reduce,Javascript,Function,Return,Reduce,构造一个函数交集,比较输入数组并返回一个新数组,其中包含在所有输入中找到的元素 我的解决方案可行,但非常麻烦: const intersection = (arrMerged) => { let finalArr = []; let flatArray = [].concat(...arrMerged) let newArr = []; //console.log(flatArray) //let interArray = []; if (arrMer

构造一个函数交集,比较输入数组并返回一个新数组,其中包含在所有输入中找到的元素

我的解决方案可行,但非常麻烦:

const intersection = (arrMerged) => {

  let finalArr = []; 
  let flatArray = [].concat(...arrMerged)

  let newArr = []; 
  //console.log(flatArray)

  //let interArray = []; 

  if (arrMerged[2] !== undefined){

    newArr = arrMerged[0].map((elem) => {
      if (arrMerged[1].includes(elem) && arrMerged[2].includes(elem)){
        return elem; 
      }
    })
  }

  else {
    newArr = arrMerged[0].map((elem) => {
      if (arrMerged[1].includes(elem)){
        return elem; 
      }
    })
  }


  newArr.forEach((elem) => {
    if (elem !== undefined){
      finalArr.push(elem)
    }
  })
  return finalArr; 
}

// Uncomment these to check your work!
const arr1 = [5, 10, 15, 20];
const arr2 = [15, 88, 1, 5, 7];
const arr3 = [1, 10, 15, 5, 20];

console.log(intersection([arr1, arr2, arr3])); // should log: [5, 15]
我还想在解决方案中使用reduce()。有没有人能提供一个使用reduce()且效率更高的替代代码解决方案


如果您能评论一下您的每一行代码都在做些什么来帮助我理解,我将不胜感激

您可以这样使用
reduce

const intersection = (arrays) =>
    arrays.reduce((a, b) =>
        a.filter(c => b.some(d => c === d)) 
    );
filter
部分执行两个给定数组的交集
a
b
reduce
部分通过从输入中获取下一个数组并将其与上一个结果相交来应用此逻辑

然而,这并不是最理想的方式。使用大型阵列时,请使用
集合
,以获得更好的性能

const intersection = (arrays) =>
    arrays.reduce((a, b) => {
        const set = new Set(b);
        return a.filter(c => set.has(c)); 
    });
有关这方面的更多信息,请参阅的答案--仅处理两个数组作为输入。

您可以在任何子数组上使用
filter()
。并在主数组上使用嵌套的
every()

const arr1=[5,10,15,20];
常数arr2=[15,88,1,5,7];
常数arr3=[1,10,15,5,20];
const intersection=arr=>arr[0]。过滤器(x=>arr.every(a=>a.includes(x));

log(交叉点([arr1,arr2,arr3])
您可以获取第一个索引数组,并将其与每个其他数组匹配,并根据相应的值进行筛选

const arr1=[5,10,15,20];
常数arr2=[15,88,1,5,7];
常数arr3=[1,10,15,5,20];
常数交点=(arr)=>{
让[a,…rest]=arr
返回a.filter(v=>rest.every(val=>val.includes(v)))
}

日志(交叉点([arr1,arr2,arr3])我有点困惑:下面的代码在做什么?a、 filter(c=>b.some(d=>c==d))@PineNuts0,
filter
迭代
a
数组,并返回一个新数组,该数组包含表达式
b.some(d=>c==d)为真的值
b.some
迭代另一个
b
数组,并在至少找到满足
c==d
的元素时返回true。谢谢;下面的代码在做什么?x=>arr.every(a=>a.includes(x))@PineNuts0我添加了一个解释。如果你不明白一些事情,问一下。奇怪的是,问题是关于使用
reduce
,这个答案被接受了。我很困惑。@trincot我不知道为什么会这样。有时新用户对高阶数组方法不太了解。他们只知道其中一个人的名字,然后在问题中问这个问题。他们不知道最适合他们目的的方法。