【问题标题】:filter the item whose first element is more than twice repeated in array [duplicate]过滤数组中第一个元素重复两次以上的项目[重复]
【发布时间】:2021-12-12 22:23:53
【问题描述】:

我有一个数组,想过滤第一个元素在这个数组中重复两次以上的项。

朋友们,我该怎么做呢?

 arr=[
[a,1],
[a,2],
[a,4],
[b,2],
[C,2],
[d,2],
[e,2],
[e,2],
[n,2],
...
]

我希望过滤器的结果如下所示

 result=[
[a,1],
[a,2],
[a,4],
[e,2],
[e,2],
...
]

【问题讨论】:

标签: javascript arrays filter


【解决方案1】:

arr=[['a',1],['a',2],['a',4],['b',2],['C',2],['d',2],['e',2],['e',2],['n',2]]; temp=arr.map(val=>val[0]).filter((a,i,aa)=>aa.indexOf(a)===i&&aa.lastIndexOf(a)!==i);
result=arr.filter((a, i,aa)=>temp.includes(aa[i][0]));
console.log(result)

【讨论】:

    【解决方案2】:

    想要过滤第一个元素在这个数组中重复两次以上的项。

    你需要这样做:

    1. 使用包含重复时间的字符的元素制作哈希映射。
    2. 只保留数组中重复两个或多个的元素 次。
    const arrays=[['a',1], ['a',2], ['a',4], ['b',2], ['C',2], ['d',2], ['e',2],['e',2], ['n',2]];
    
    //utility function to get keys of each entry
    const keys = arr => arr.map(char=>char[0]);
    
    let chars = keys(arrays); // ['a', 'a', 'a', 'b', 'C', 'd', 'e', 'e', 'e', 'n']
    
    // 1.
    const hashMap = new Map();
    chars.forEach(char=>{
        count = hashMap.get(char)||0;
        hashMap.set(char, ++count);
    });
    const dict = [...hashMap].filter(([char, count])=>count>=2)
    
    // 2.
    uniqueChars = keys(dict);
    const result = arrays.filter(([chr, num])=>uniqueChars.includes(chr))
    console.log(result)
    

    结果:

    ['a', 1]
    ['a', 2]
    ['a', 4]
    ['e', 2]
    ['e', 2]
    

    【讨论】:

      【解决方案3】:

      看看这个:

      arr=[['a',1], ['a',2], ['a',4], ['b',2], ['C',2], ['d',2], ['e',2], ['e',2], ['n',2]];
      
       const reducedObject = arr
        .reduce((acc, [key, value]) => (
          acc[key] = acc[key] 
            ? [...acc[key], [key, value]] 
            : [[key, value]],
          acc
        ), {});
      
        console.log(reducedObject);
      // {
      //   a: [ [ 'a', 1 ], [ 'a', 2 ], [ 'a', 4 ] ],
      //   b: [ [ 'b', 2 ] ],
      //   C: [ [ 'C', 2 ] ],
      //   d: [ [ 'd', 2 ] ],
      //   e: [ [ 'e', 2 ], [ 'e', 2 ] ],
      //   n: [ [ 'n', 2 ] ]
      // }
      
      const result = Object
        .values(reducedObject)
        .filter((values) => (values.length >= 2))
        .reduce((acc, values) => ([...acc, ...values]), []);
      
      console.log(result);
      // [ 
      //   [ 'a', 1 ], 
      //   [ 'a', 2 ], 
      //   [ 'a', 4 ], 
      //   [ 'e', 2 ], 
      //   [ 'e', 2 ] 
      // ]
      

      另一种单线解决方案:

      const result2 = arr
        .map(([ key ]) => key)  //[ 'a', 'a', 'a', 'b', 'C', 'd', 'e', 'e', 'n' ]
        .filter((key, index, array) => array.indexOf(key) !== index)  //[ 'a', 'a', 'e' ]
        .filter((key, index, array) => array.indexOf(key) === index)  //[ 'a', 'e' ]
        .reduce((acc, key) => (  
          [...acc, ...arr.filter(([ itemKey ]) => (itemKey === key))]
        ), []);   
        
      console.log(result2);
      // [ [ 'a', 1 ], [ 'a', 2 ], [ 'a', 4 ], [ 'e', 2 ], [ 'e', 2 ] ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-26
        • 2021-12-23
        • 1970-01-01
        • 2016-12-27
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        相关资源
        最近更新 更多