尝试遍历第二个数组以查看第一个数组是否匹配,哪里有匹配,那么第二个数组(或新数组)的索引将包含每次找到元素的数量,它将将它显示在一个新数组中:
function getOccur(ar1, ar2){
let ar = [];
return ar2.filter((el,i)=>ar2.includes((el)=>{
ar[i]+= 1;
}));
return ar;
}
getOccur(
['apple', 'orange', 'apple', 'pp', 'pear', 'orange'],
['apple', 'orange', 'pear', 'banana']
);
我想要的输出是:
[2, 2, 1, 0]
也就是说,apple
发生2次,orange
发生2次,pear
发生1次,banana
发生0次
答案 0 :(得分:4)
如何循环第二个数组,并使用过滤器计算第一个数组中每个项目的出现次数?这样,您可以删除includes
,代码更容易理解。
function getOccur(arr1, arr2) {
let finalArr = [];
arr2.forEach((a) => {
finalArr.push(arr1.filter(item => item === a).length);
});
return finalArr;
}
const arr1 = ['apple', 'orange', 'apple', 'pp', 'pear', 'orange'];
const arr2 = ['apple', 'orange', 'pear', 'banana'];
console.log(getOccur(arr1, arr2));

答案 1 :(得分:2)
您需要计算出现次数 - includes
只会为您提供true
或false
,而filter
只会为您提供原始过滤版本阵列。这些都不适合这种情况 - 我会使用reduce
代替O(n)
解决方案:
const getOccur = (ar1, ar2) => Object.values(
ar1.reduce(
(a, item) => {
if (item in a) a[item]++;
return a;
},
ar2.reduce((a, prop) => {
a[prop] = 0;
return a;
}, {})
)
);
console.log(
getOccur(
['apple', 'orange', 'apple', 'pp', 'pear', 'orange'],
['apple', 'orange', 'pear', 'banana']
)
);
答案 2 :(得分:1)
使用map和forEach的另一种解决方案
function getOccur(ar1, ar2) {
const result = ar2.map(fruit => {
let foundCount = 0;
ar1.forEach((element) => { foundCount += (element === fruit ? 1 : 0) })
return foundCount
})
return result
}
console.log(getOccur(['apple', 'orange', 'apple', 'pp', 'pear', 'orange'], ['apple', 'orange', 'pear', 'banana']))
答案 3 :(得分:1)
阵列过滤器可能无法满足您的需求。
只需处理两个可以正常工作的forEach
。
function getOccur(ar1, ar2) {
let ar = [];
let index = 0;
ar2.forEach(
(el) => {
ar.push(0);
ar1.forEach(
(el2) => {
if (el == el2) ar[index] += 1;
}
);
index++;
}
);
return ar;
}
console.log(
getOccur(
['apple', 'orange', 'apple', 'pp', 'pear', 'orange'], ['apple', 'orange', 'pear', 'banana']
));