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

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

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

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

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

【问题讨论】:

    标签: javascript arrays duplicates


    【解决方案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) - 检查我编辑的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 2014-01-26
      • 2020-03-30
      • 2020-12-28
      • 2019-01-02
      • 2013-03-05
      • 2021-07-20
      • 2020-10-21
      相关资源
      最近更新 更多