javascript - Javascript Array - 检查 2 个数组中的匹配项
问题描述
我有 2 个字符串对象数组。
let count = 0;
var basket1 = [‘Apples’, ‘Cucumber’, ‘Lettuce’, ‘Bananas’, ‘Pears’, ‘Cauliflower’, ‘Strawberry’]
var basket2 = [‘Apples’, ‘Bananas’, ‘Oranges’, ‘Pears’, ‘Pineapple’, ‘Strawberry’]
当篮子 1 和篮子 2 中有相同的项目时,我想增加计数。
注意:篮子 1 和篮子 2 的长度可以改变,篮子 1.length > 篮子 2.length,篮子 1.length < 篮子 2.length 或篮子 1.length =篮子2.length,
我刚在想:
- 循环通过篮子
basket.forEach( (item) => {} )
- 对于每个项目,如果
otherBasket.includes(item), count++
我只是想知道是否有更有效的方法来做到这一点。
解决方案
如果每个项在每个数组中只能出现一次,则可以将它们组合成一个数组,然后计数将是组合数组的总长度 - 组合数组的 Set 的大小(仅唯一项)。
const basket1 = ['Apples', 'Cucumber', 'Lettuce', 'Bananas', 'Pears', 'Cauliflower', 'Strawberry']
const basket2 = ['Apples', 'Bananas', 'Oranges', 'Pears', 'Pineapple', 'Strawberry']
const combined = [...basket1, ...basket2];
const count = combined.length - new Set(combined).size;
console.log(count);
如果该项目可以在每个数组中出现多次:
const basket1 = ['Apples', 'Cucumber', 'Lettuce', 'Bananas', 'Bananas', 'Pears', 'Cauliflower', 'Strawberry', 'Apples']; // apple appears twice, bananas appears twice
const basket2 = ['Apples', 'Bananas', 'Bananas', 'Oranges', 'Pears', 'Pineapple', 'Strawberry']; // apple appears once, bananas appear twice
// create an object with the counts of each item in basket1
const total1 = basket1.reduce((r, s) => {
r[s] = (r[s] || 0) + 1;
return r;
}, {});
const count = basket2.reduce((cnt, s) => {
// if has a value > 0 in total1, decrment the value, and add 1 to the count
if(total1[s]) {
total1[s]--;
cnt++;
}
return cnt;
}, 0);
console.log(count);
推荐阅读
- unity3d - 确定 Quad Sphere Face 边缘的 Quad Tree 邻居的有效方法?
- html - 将 XML 转换为 HTML
- java - Selenium - Java - ChromeDriver:打开空白“数据”;在某些情况下,在打开另一个运行实际测试的 chrome 窗口之前?
- css - Chrome中的剪辑路径水平白线
- javascript - 用于 Angular 测试的 JS 堆内存不足
- javascript - 如果不在焦点上,Google 自动完成输入不起作用
- linux - 过滤命令输出并将其保存在 Json 格式列表中的 Shell 脚本
- angular - 具有材料组件的角度形式更改事件
- javascript - 每次表更改时执行 JavaScript 代码
- python - 使用 Python ruamel.yaml,在往返模式下加载时丢失锚点?