【问题标题】:remove duplicated pairs of object arrays in javascript在javascript中删除重复的对象数组对
【发布时间】:2014-12-23 17:46:38
【问题描述】:

Fiddle Example:

我有一个这样的对象数组:

var bigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
  [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
];

如何删除任何具有 id545 和 391 的重复对象对以将数组缩减为:

var newbigarr = 
[ 
  [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
  [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}]
];

我想过通过创建一个新的数组列表来过滤掉重复的对:

[{391: 391,545: 545},{390: 390,545: 545}]

然后迭代它和bigarr 以构建newbigarr,但我的代码甚至无法创建该列表。

var test_id = [];
for(var i = 0;i < bigarr.length;i++)
{
   var value_obj = {};
   for(var j in bigarr[i])
   {
     var value = bigarr[i][j]["id"];  
     value_obj[value] = value;
   }
   test_id.push(value_obj);
}

console.log(test_id);

我正在使用 lodash,因此欢迎任何涉及 lodash 的解决方案。

【问题讨论】:

    标签: javascript arrays underscore.js lodash


    【解决方案1】:

    如果你使用下划线,你可以这样做:

    var bigarr = 
    [ 
      [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
      [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
      [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
      [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
    ];
    
    console.log(_.uniq(bigarr,function(item){
        return [
            [item[0].id+item[0].name],
            [item[1].id+item[1].name]
        ].sort().toString()
    }))
    

    编辑:这仅在您始终拥有一对具有 id 和字符串名称的对象时才有效。不检查加深的对象或其他键

    【讨论】:

    • 您正在对键和值格式做出未说明的假设。
    • 仅使用给出的示例
    • 这是一个懒惰的回应,你至少应该告诉人们你留下的漏洞。
    【解决方案2】:

    JSFIDDLE

    如果您使用纯 js,您可以使用迭代和辅助数组来跟踪您所看到的内容:

    var bigarr = 
    [ 
      [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
      [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
      [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
      [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
    ];
    
    var seen = [];
    var final = [];
    
    for(i = 0; i < bigarr.length; i++){
        var unseen = true;
        for(j = 0;j<seen.length;j++){
            if((seen[j][0] == bigarr[i][0].id && seen[j][1] == bigarr[i][1].id) || (seen[j][0] == bigarr[i][1].id && seen[j][1] == bigarr[i][0].id)
              ){
                unseen = false;
            }
        }
        if(unseen){
            final.push(bigarr[i]);
            seen.push([bigarr[i][0].id, bigarr[i][1].id]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用 Lo-Dash。 JSFiddle

      var bigarr = 
      [ 
        [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
        [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
        [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
        [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
      ];
      
      var seenIds = {};
      var nodup = _.filter(bigarr, function(pair) {
          var ids = [pair[0].id, pair[1].id].sort();
          if(seenIds[ids]) {
              return false;
          } else {
              seenIds[ids] = true;
              return true;
          }
      });
      

      【讨论】:

        【解决方案4】:

        带 lo-dash (jsFiddle) 的单行解决方案:

        var bigarr = 
        [ 
          [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}],
          [ { name: 'EFG',id: 390},{ name: 'XYZ',id: 545}],
          [ { name: 'XYZ',id: 545},{ name: 'ABC',id: 391}],
          [ { name: 'ABC',id: 391},{ name: 'XYZ',id: 545}]
        ];  
        
        _.uniq(bigarr, function(a) { return _.pluck(a, 'id').sort() + '' });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 2014-06-25
          • 1970-01-01
          • 2018-08-15
          • 2018-06-19
          • 2020-10-25
          • 2020-04-15
          相关资源
          最近更新 更多