【问题标题】:Get Duplicates from Object in Angularjs从Angularjs中的对象获取重复项
【发布时间】:2018-12-06 14:03:11
【问题描述】:

我需要一些关于getting duplicate Object from the Object 的帮助,我一直卡住。

举例

My Object = {1: 'cat', 2: 'dog', 3: 'cat'}

预期结果应该是

{1: 'cat'}

【问题讨论】:

    标签: javascript angularjs underscore.js lodash


    【解决方案1】:

    使用类似的东西,

    var answers =  {1: 'cat', 2: 'dog', 3: 'cat'}
    
    var keys = Object.keys(answers);
    var dupe = {};
    
    for(var i=0;i<keys.length;i++){
     for(var j=i+1;j<keys.length;j++){
       if(answers[keys[i]] === answers[keys[j]]){
         dupe[keys[i]] = answers[keys[i]];
       }
     }
    }
      console.log(dupe)

    【讨论】:

      【解决方案2】:

      您可以使用映射计算出现次数,并获取结果集的第一个找到的键/值对。

      var object = { 1: 'cat', 2: 'dog', 3: 'cat' },
          result = Object.assign(
              ...Array.from(
                  Object
                      .entries(object)
                      .reduce((m, [k, v]) => (([l, c]) => m.set(v, [l, c + 1]))(m.get(v) || [k, -1]), new Map),
                  ([v, [k, c]]) => c && { [k]: v }
              )
          );
      
      console.log(result);

      【讨论】:

        【解决方案3】:

        使用 lodash,您可以将对象转换为对数组,按值对它们进行分组,并删除不重复的组,然后再转换回数组:

        const object = { 1: 'cat', 2: 'dog', 3: 'cat' }
        
        const fn = _.flow([
          _.toPairs, // convert to pairs [key, value]
          o => _.groupBy(o, _.last), // group the pairs by the value
          o => _.filter(o, g => g.length > 1), // filter out group with no duplicates
          o => _.map(o, _.first), // get the 1st item from each group
          _.fromPairs // convert back to object
        ])
        
        const result = fn(object)
        
        console.log(result)
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

        【讨论】:

          【解决方案4】:

          这是另一个基于Array.reduce的实现:

          const o = { 1: 'cat', 2: 'dog', 3: 'cat' }
          
          const result = Object.entries(o).reduce((r, [k,v], idx, arr) => {
            r[v] = [...(r[v] || []), { [k]: v }]
            return idx == arr.length-1 ? Object.values(r).find(x => x.length > 1)[0] : r
          }, {})
          console.log(result)

          这里有更多细节:

          const object = { 1: 'cat', 2: 'dog', 3: 'cat' }
          
          const result = 
            Object.entries(object)  // get object key & value in the form of [key,value]
            .reduce((accumulator, [k,v], index, array) => {  // start an `Array.reduce`
            // create the grouping on the value `cat`/`dog`
            accumulator[v] = [...(accumulator[v] || []), { [k]: v }] 
            if(index == array.length-1)  // if we are at the end of the `Array.reduce`
              // Return the values of the accumulator filtered by the arrays which length is more than 1
              // and take from that array the initial element 
              return Object.values(accumulator).find(x => x.length > 1)[0]
            else // Not at the end keep returning the accumulator
              return accumulator
          }, {})
          
          console.log(result)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-12
            相关资源
            最近更新 更多