Javascript从多个数组中查找所有重复项

Posted

技术标签:

【中文标题】Javascript从多个数组中查找所有重复项【英文标题】:Javascript find all duplicate items from multiple arrays 【发布时间】:2021-07-30 03:08:17 【问题描述】:

我有数组数组,每个数组都有唯一的 items 。 我需要找到所有数组之间的所有重复项并将其收集到新数组中。

对于这个输入: [[1,2,6,9],[3,2,7,5,12],[1,3]]

我需要这个输出: [1,2,3]

现在有人知道最好的方法是什么吗?

【问题讨论】:

【参考方案1】:

您可以对对象进行闭包以计算值。

const
    data = [[1, 2, 6, 9], [3, 2, 7, 5, 12], [1, 3]],
    result = data
        .flat()
        .filter(
            (o => v => (o[v] = (o[v] || 0) + 1) === 2)
            ()
        );

console.log(result);

【讨论】:

【参考方案2】:

你可以试试这个,最好用O(3N)=== O(N) complexity

let arr = [
  [1, 2, 6, 9],
  [3, 2, 7, 5, 12],
  [1, 3]
];

let a = arr.flat()

let obj = ;

for (let i = 0; i < a.length; i++) 
  if (obj[a[i]]) obj[a[i]]++;
  else obj[a[i]] = 1

let repeated = [];
for (let i in obj) 
  if (obj[i] > 1) 

    repeated.push(i)
  


console.log(repeated)

【讨论】:

谢谢,是否可以累积它来自的数组,作为键或对象?所以结果看起来像这样:0_2:1,0_1:2,1_2:3)【参考方案3】:

根据“重复”的含义,@Nina 的解决方案可以修改为仅包含值恰好出现两次的情况。我稍作修改的示例 sn-p 将排除值 1,因为它出现 3 次:

const data = [[1, 2, 6, 9], [3, 2, 7, 5, 12], [1, 3], [1, 7]], k=2, // no. of occurrences

result = data.reduce((o,c,i)=>(c.forEach(v=>o[v]=(o[v]||0)+1),o),[])
             .map((v,i,a)=>(a[i] = v===k ? i : undefined ))
             .filter(v=>v);

console.log(result);

警告:这仅适用于数值(整数!)。

但这里有另一个版本可以处理任何类型的内容

var data = [[1, 2, 6, 9, "c"], [3, "a", 2, 7, 5, 12], [1, "c", 3], [1, 7]], k=2;

res=[...data.reduce((o,c,i)=>(c.forEach(v=>o.set(v,(o.get(v)||0)+1)),o),
                    new Map()).entries()]
    .filter(([k,v])=>v===2)
    .map(([k,v])=>k)
   

console.log(res)

更新

如果您想要找到重复项的第一个位置的地址,您可以这样做:

var data = [[1, 2, 6, 9, "c"], [3, "a", 2, 7, 5, 12], [1, "c", 3], [1, 7]], n=2;

res=[...data.reduce((o,c,i)=>(c.forEach(v=>o.set(v,(o.get(v)||0)+1)),o),
                    new Map()).entries()]
    .filter(([k,v])=>v===n)
    .map(([k,v],j)=>[data.findIndex((d,i)=>(j=d.indexOf(k))>-1)+"_"+j, k])

console.log(Object.fromEntries(res))

【讨论】:

谢谢大家,我想知道是否可以存储重复项的来源,我的意思是第一个数组第二个数组等? 那么,您想要他们第一次出现的“地址”,是的,就像您原始示例中的"0_2":1,"0_1":2,"1_2":3) 一样?或者,对于我的示例数据,结果将是 "0_1":2,"0_4":"c","1_0":3,"1_3":7) - 检查我编辑的答案。

以上是关于Javascript从多个数组中查找所有重复项的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 从数组中删除所有重复项 [重复]

如何使用Javascript从特定的单个数组中查找所有不重复的组合

JavaScript 数组删除重复的单词或字符(如果只输入字符。不要从 1 个单词中删除所有重复项

关于如何去除数组中重复项

在 Array、Javascript 中查找重复项

java 442.查找数组中的所有重复项(第1个).java