Javascript:查找匹配多个字段的对象数组值

给定这个对象数组:

[ { 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 }] 

我需要一个新的键/值的独特dupearrays:

  [ { 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 }] 

我正在使用这个SO答案的代码,但它删除了太多的target_q_id独特的target_q_id因为它不包括source_q_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; } 

我将如何修改代码来为source_q_idtarget_q_idfind唯一的source_q_id target_q_id

您可以简单地将这些属性组合起来,并将其用作您的集合中的一个键
另外需要注意的是:如果你在.forEach.forEach项目,那么你很可能做错了什么。

尝试使用Array.prototype.filter

 Array.prototype.uniqueBy = function(keyBuilder) { var seen = {}; return this.filter(function(o) { // build a filter key using a provided function var key = keyBuilder(o); // if item already exists - do not add to the result if (seen[key]) return false; // add item to the set and add item to the result // shortand for: // seen[key] = true; return true; return (seen[key] = true); }); } var obj = [{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}]; var objFiltered = obj.uniqueBy(function(o) { return o.source_q_id + "~~~" + o.target_q_id; }); console.log(objFiltered);