首页 > 解决方案 > 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,

我刚在想:

  1. 循环通过篮子basket.forEach( (item) => {} )
  2. 对于每个项目,如果otherBasket.includes(item), count++

我只是想知道是否有更有效的方法来做到这一点。

标签: javascriptarrays

解决方案


如果每个项在每个数组中只能出现一次,则可以将它们组合成一个数组,然后计数将是组合数组的总长度 - 组合数组的 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);


推荐阅读