挑战:构造一个函数交集,比较输入数组并返回一个包含在所有输入中找到的元素的新数组。
在使用 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]
我认为你想用第二种解决方案做的更像这样:
用输入数组的
first、
second和
third替换
cache1
、cache2
、cache3
:
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]
我希望这会有所帮助。