Javascript:查找匹配多个字段的对象数组值副本
给定此对象数组:Javascript:查找匹配多个字段的对象数组值副本,javascript,arrays,node.js,Javascript,Arrays,Node.js,给定此对象数组: [ { source_q_id: 'Q2B', target_q_id: null }, { source_q_id: 'Q2B', target_q_id: null }, { source_q_id: 'Q2B', target_q_id: null }, { source_q_id: 'Q5C', target_q_id: 'Q7' }, { source_q_id: 'Q5C', target_q_id: 'Q7' }, { source_q_id:
[ { source_q_id: 'Q2B', target_q_id: null },
{ source_q_id: 'Q2B', target_q_id: null },
{ source_q_id: 'Q2B', target_q_id: null },
{ source_q_id: 'Q5C', target_q_id: 'Q7' },
{ source_q_id: 'Q5C', target_q_id: 'Q7' },
{ source_q_id: 'Q5C', target_q_id: 'Q7' },
{ source_q_id: 'Q5D', target_q_id: 'Q7' },
{ source_q_id: 'Q5D', target_q_id: 'Q7' },
{ source_q_id: 'Q5D', target_q_id: 'Q7' },
{ source_q_id: 'Q6A1', target_q_id: 'Q7' },
{ source_q_id: 'Q6A1', target_q_id: 'Q7' },
{ source_q_id: 'Q6A1', target_q_id: 'Q7' },
{ source_q_id: 'Q6A2', target_q_id: null },
{ source_q_id: 'Q6A2', target_q_id: null },
{ source_q_id: 'Q6A3', target_q_id: 'Q7' },
{ source_q_id: 'Q6A3', target_q_id: 'Q7' },
{ source_q_id: 'Q6A3', target_q_id: 'Q7' },
{ source_q_id: 'Q6B', target_q_id: 'Q6A2' },
{ source_q_id: 'Q6B', target_q_id: 'Q6A2' },
{ source_q_id: 'Q7', target_q_id: null },
{ source_q_id: 'Q7', target_q_id: null }]
我需要两个键/值的唯一副本的新数组:
[ { source_q_id: 'Q2B', target_q_id: null },
{ source_q_id: 'Q5C', target_q_id: 'Q7' },
{ source_q_id: 'Q5D', target_q_id: 'Q7' },
{ source_q_id: 'Q6A1', target_q_id: 'Q7' },
{ source_q_id: 'Q6A2', target_q_id: null },
{ source_q_id: 'Q6A3', target_q_id: 'Q7' },
{ source_q_id: 'Q6B', target_q_id: 'Q6A2' },
{ source_q_id: 'Q7', target_q_id: null }]
我正在使用此代码,但它删除了太多的target\u q\u id
唯一重复,因为它不计算source\u q\u id
重复:
[ { source_q_id: 'Q2B', target_q_id: null },
{ source_q_id: 'Q5C', target_q_id: 'Q7' },
{ source_q_id: 'Q6B', target_q_id: 'Q6A2' } ]
守则:
function dupesOnly(arr, 'target_q_id') {
var seen = {},
ret = [];
arr.forEach(function(item) {
var key = item[field],
val = seen[key];
if (!val) {
seen[key] = val = {
initial: item,
count: 0
}
}
if (val.count === 1) {
ret.push(val.initial);
}
++val.count;
});
return ret;
}
如何修改代码以找到
源\u q\u id
和目标\u q\u id
的唯一副本?您可以简单地组合这些属性并将其用作集合中的键。另一个注意事项:如果您在
.forEach
中.push
项目,那么您很可能做错了什么
尝试使用数组.prototype.filter
:
Array.prototype.uniqueBy=函数(keyBuilder){
var-seen={};
返回此.filter(函数(o){
//使用提供的函数构建筛选键
var key=keyBuilder(o);
//如果项目已存在-不要添加到结果中
如果(见[键])
返回false;
//将项添加到集合中,并将项添加到结果中
//缩写为:
//seed[key]=true;返回true;
返回(seed[key]=true);
});
}
目前,我国,{源源区q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q J{{{{{{{{源区q q q q q q q q q q q q q q q q q q q q q q q身份::'Q2B'Q2B},目标B}{{{{{1}{{{{1}{{{{1{{{1}1{1{{1}1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1{1}u-id:'Q7'},{source\u-q\u-id:'Q5D',target\u-q\u-id:'Q7'},{source\u-q\u-id:'Q5D',target\u-q\u-id:'Q7'},(7)中国,{源(源)源(源)源(源)源(源)q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q q u id:'Q7'},{source_q_id:'Q6A3',target_q_id:'Q7'},{source_q_id:'Q6B',target_q_id:'Q6A2'},{source_q_id:'Q6B',target_q_id:'Q6A2'},{source_q_id:'Q7',target_q_id:null},{source_q_id:'Q7',target_q_id:null}];
var objFiltered=obj.uniqueBy(函数(o){
返回o.source\u q\u id+“~~~”+o.target\u q\u id;
});
console.log(objFiltered);