我有一百万来自不同群体的联系人。例如
{"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实现它的最佳方法是什么?
答案 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()
与外部数组一起使用,该数组将存储所有现有项目:
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;
如果上一个对象中的所有项目都包含在下一个对象中,您可以使用简单的Array#slice
:
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;