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);