这种方法计算每个项目的数量。在迭代完所有数组之后,选择等于数组数量的计数。
为了通用性,该函数接受一个数组的数组和比较函数,以在使用对象而不是原始值的情况下生成映射键。
它返回一个共同值的数组,使用第一个数组的实例作为参考。
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)