在多个JavaScript数组之间查找匹配项

76

我有多个包含字符串值的数组,希望比较它们并仅保留在所有数组中都相同的匹配结果。

给定以下示例代码:

var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr2 = ['taco', 'fish', 'apple', 'pizza'];
var arr3 = ['banana', 'pizza', 'fish', 'apple'];

我希望生成一个包含所有给定数组中匹配项的以下数组:

['apple', 'fish', 'pizza']
我知道可以用var newArr = arr1.concat(arr2, arr3);组合所有的数组,但这只会给我一个包含所有元素(包括重复元素)的数组。有没有简单的方法可以做到这一点,而不需要使用像underscore.js这样的库?
(太好了,现在我又饿了!) 编辑:我想我应该提到可能会有未知数量的数组,我只是举了三个例子。

看一下这个链接:https://dev59.com/kXI-5IYBdhLWcg3wYnOQ - nbrooks
13个回答

0

另一种解决方案:

const arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
const arr2 = ['taco', 'fish', 'apple', 'pizza'];
const arr3 = ['banana', 'pizza', 'fish', 'apple'];
const combinedArr = [arr1, arr2, arr3];

const result  = combinedArr
    .flatMap(([...values]) => values)
    .filter((value, index, coll) => (coll.indexOf(value) === index) && combinedArr.every(
        (values) => values.includes(value)
    ));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0
你可以使用 array#reducearray#filter。对于每个数组,获取所有唯一值,并在一个 Map 中查找并保留它们的计数。完成后,根据数组长度过滤此查找结果,使用 array#filter

const commonElements = (...arr) => {
  const lookup = arr.reduce((map, a) => {
    const unique = [...new Set(a)];
    unique.forEach(v => {
      map.set(v, (map.get(v) || 0) + 1)
    });
    return map;
  },new Map());
  return [...lookup.keys()].filter(k => lookup.get(k) === arr.length);
}

const arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'],
      arr2 = ['taco', 'fish', 'apple', 'pizza'],
      arr3 = ['banana', 'pizza', 'fish', 'apple'];
console.log(commonElements(arr1,arr2,arr3));


0

这种方法计算每个项目的数量。在迭代完所有数组之后,选择等于数组数量的计数。

为了通用性,该函数接受一个数组的数组和比较函数,以在使用对象而不是原始值的情况下生成映射键。

它返回一个共同值的数组,使用第一个数组的实例作为参考。

function commonValues<T>(arrays: T[][], keyFn: (item: T) => string): T[] {
  const counts: Record<any, { count: number, item: T }> = {}
  for (const array of arrays) {
    for (const item of array) {
      const key = keyFn(item)
      let entry = counts[key]
      if (!entry) {
        entry = {count: 0, item}
        counts[key] = entry
      }
      entry.count++
    }
  }
  return Object.values(counts)
      .filter(it => it.count === arrays.length)
      .map(it => it.item)
}

// 对于这个基本示例,关键函数只是返回字符串。
var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr2 = ['taco', 'fish', 'apple', 'pizza'];
var arr3 = ['banana', 'pizza', 'fish', 'apple'];

const common = commonItems([arr1,arr2,arr3], it=>it)

function commonValues(arrays, keyFn) {
  const counts = {}
  for (const array of arrays) {
    for (const item of array) {
      const key = keyFn(item)
      let entry = counts[key]
      if (!entry) {
        entry = {count: 0, item}
        counts[key] = entry
      }
      entry.count++
    }
  }
  return Object.values(counts)
      .filter(it => it.count === arrays.length)
      .map(it => it.item)
}

var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr2 = ['taco', 'fish', 'apple', 'pizza'];
var arr3 = ['banana', 'pizza', 'fish', 'apple'];

const found = commonValues([arr1,arr2,arr3], it=>it)

console.log('common', found)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接