使用javascript

时间:2017-03-10 11:53:39

标签: javascript lodash

我有一百万来自不同群体的联系人。例如

    {"GROUP":[{'G1: [C1,C2,C3........C500000]},
             {'G2': [C1,C2,C3........C500000,D1,D2,D3........D500000]}
.....]
    }

G1有500k触点,G2有100万个触点,其中500k触点已经存在于G1中。

我想根据条件过滤上面的组对象, “应该检查已经在任何组中的联系人并从相应组中删除”。

预期结果

 {"GROUP":[{'G1: [C1,C2,C3........C500000]},
             {'G2': [D1,D2,D3........D500000]},....]
    }

此处群组及其联系人的规模可能会增加。

使用lodash javascript实现它的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

经过长时间的思考,我有这个给你:

它会自动遍历对象/数组结构并删除g1,g2,g3,...等数组中的重复字符串。

我从未使用过lodash,所以这里是vanilla js。

var object = {
    group: [
        { g1: ['a', 'b', 'c', 'd']},
        { g2: ['a', 'b', 'c', 'd', 'e', 'f', 'g']},
        { g3: ['f', 'g', 'h', 'i', 'j', 'k', 'l']}
    ]
};

var duplicateArray = [];

for(var key in object) {
  var group = object[key];
  
  for(var x = 0; x < group.length; x++) {
      var subGroup = group[x];
      
      for(var subkey in subGroup) {
          var contentArray = subGroup[subkey];
          
          for(var y = 0; y < contentArray.length; y++) {
              var value = contentArray[y];
          
              if(duplicateArray.indexOf(value) == -1) {
                  duplicateArray.push(value);
              } else {
                  object[key][x][subkey].splice(y, 1);
                  y -= 1;
              }
          }
      }
  }
}

console.log(`dub ${duplicateArray}`);
console.log(object);

答案 1 :(得分:1)

如果您不知道前一个对象中有多少项,将包含在下一个项目中,您可以将_.difference()与外部数组一起使用,该数组将存储所有现有项目:

&#13;
&#13;
var object = {
    group: [
        { g1: ['c1', 'c2', 'c3', 'c4', 'c5']},
        { g2: ['c1', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5']},
        { g3: ['c1', 'c3', 'c4', 'c5', 'd1', 'd4', 'd5', 'e1', 'e2', 'e3', 'e4', 'e5']}
    ]
};

var previousItems = [];

var group = object.group.map(function(item) {
  return _.mapValues(item, function(values) {
    var newValues = _.difference(values, previousItems);
    previousItems = previousItems.concat(newValues);
    return newValues;
  });
});

console.log(group);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

如果上一个对象中的所有项目都包含在下一个对象中,您可以使用简单的Array#slice

&#13;
&#13;
var object = {
    group: [
        { g1: ['c1', 'c2', 'c3', 'c4', 'c5']},
        { g2: ['c1', 'c2', 'c3', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5']},
        { g3: ['c1', 'c2', 'c3', 'c4', 'c5', 'd1', 'd2', 'd3', 'd4', 'd5', 'e1', 'e2', 'e3', 'e4', 'e5']}
    ]
};

var prevValues = [];

var group = object.group.map(function(item, index) {
  return _.mapValues(item, function(values) {
    var newValues = values.slice(prevValues.length);
    prevValues = values;
    return newValues;
  });
});

console.log(group);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;