使用 for 循环而不是 reduce 方法重建代码

问题描述 投票:0回答:1

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

在使用 reduce 方法找到解决方案后,我尝试重建代码 without 使用 reduce 方法 - 它没有用。我哪里做错了?使用我尝试过的基本方法能否达到预期的结果?

这是原始解决方案。

function intersection1 (arrayOfArrays) {
    return arrayOfArrays.reduce((accumulator, currentValue) => {


      const newArr = [];

      accumulator.forEach((ele)=>{
        if (currentValue.includes(ele)) { 
          result.push(ele);
        };
      })
      return result;
    });
  }
  const arr1 = [5, 10, 15, 20];
  const arr2 = [15, 88, 1, 5, 7];
  const arr3 = [1, 10, 15, 5, 20];
  console.log(intersection1([arr1, arr2, arr3])); // should log: [5, 15]

我尝试了以下方法,但它不起作用。它不记录: [5, 15] 而只是: 1

function intersection (arrayOfArrays) {
    const newArr = [];
    let cache1 = [];
    let cache2 = [];
    let cache3 = [];

    for (let i = 0; i < arrayOfArrays.length; i++) {
      return cache1.push(arrayOfArrays[i]);
      
    }    

    for (let j = 1; j < arrayOfArrays.length; j++) {
      return cache2.push(arrayOfArrays[j]);

    }

    for (let n = 2; n <= arrayOfArrays.length; n++) {
      return cache3.push(arrayOfArrays[n]);

    }
    cache1.forEach((ele) => {
      if (cache2.includes(ele) && cache3.includes(ele)) {
        newArr.push(ele);
      }
    });
    return newArr;
  }

  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]
javascript arrays for-loop reduce
1个回答
0
投票

我认为你想用第二种解决方案做的更像这样:

用输入数组的

first
second
third
替换cache1cache2cache3

function intersection (arrayOfArrays) {
    const newArr = [];
    let cache1 = arrayOfArrays[0]
    let cache2 = arrayOfArrays[1]
    let cache3 = arrayOfArrays[2]

    cache1.forEach((ele) => {
      if (cache2.includes(ele) && cache3.includes(ele)) {
        newArr.push(ele);
      }
    });
    return newArr;
  }

  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])); // log: [5, 15]

但是如您所知,此函数仅在您将 3 个数组固定为其参数的数组时才有效。

我们可以用其他方式重写这个函数,但不受输入数组长度的限制:

function intersection3(arrayOfArrays) {
  let result = arrayOfArrays[0];

  arrayOfArrays.forEach((arr) => {
    const newResult = [];
    arr.forEach((elm) => {
      if (result.includes(elm) && !newResult.includes(elm)) {
        newResult.push(elm);
      }
    });
    result = newResult;
  });

  return result;
}


  const arr1 = [5, 10, 15, 20];
  const arr2 = [15, 88, 1, 5, 7];
  const arr3 = [1, 10, 15, 5, 20];
  const arr4 = [1, 10, 15, 5];
  console.log(intersection3([arr1, arr2, arr3, arr4])); // log: [5, 15]

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.