Javascript lodash/下划线;比较两个对象并删除重复项

Javascript lodash/下划线;比较两个对象并删除重复项,javascript,json,object,underscore.js,lodash,Javascript,Json,Object,Underscore.js,Lodash,如下图所示,我返回了一些jsondata,其中包含三个对象;每个都包含一个客户端id=>数据 exact_match : {104} match_4 : {104, 103} match_2 : {104, 103, 68} 如何根据以前的对象“修剪”或删除重复的对象?比如: exact_match : {104} match_4 : {103} match_2 : {68} var unique = {}; // Assume I copy and pasted alreadyF

如下图所示,我返回了一些json
data
,其中包含三个对象;每个都包含一个客户端id=>数据

exact_match : {104}
match_4 :  {104, 103}
match_2 :  {104, 103, 68}

如何根据以前的对象“修剪”或删除重复的对象?比如:

exact_match : {104}
match_4 :  {103}
match_2 :  {68}
var unique = {};
// Assume I copy and pasted alreadyFound here
var alreadyFound = ...;
for (var object in data) {
  // Iterate through ids in each object in data
  for (var id in object) {
    // Remove this entry if it's already found
    if (alreadyFound(id)) {
      delete object[id];
    }
  }
}
我尝试过,但没有成功(可能是因为它是针对数组而不是对象的):

任何帮助都将不胜感激:)

更新


我需要返回的值具有相同的对象数据,而不是一个新数组:)

看起来您想要区分键(或者更确切地说,使用-)

或者,如果要在对象内进行比较,也可以将对象转换为成对数组():


我将创建一个名为
unique
的映射,例如
var unique={}
然后迭代数据中的每个键,并检查它是否在
unique
中。如果它在
unique
中,请删除与该键关联的条目,从而删除重复项

您可以将此签出作为
alreadyFound
方法:

var alreadyFound = function (key) {
  if (!(key in unique)) {
    unique[key] = true;
    return false;
  }
  return true;
};
然后迭代数据并检查数据中的
alreadyFound(key)
以查找
key
,如果
alreadyFound(key)
返回
true
,则删除该键

您可能会弄乱lodash/下划线方法,但这些方法可能效率低下,这取决于您如何使用它们(以及如何实现它们),并且这应该在线性时间内运行

对于您的特定用例,完整的解决方案可能是:

exact_match : {104}
match_4 :  {103}
match_2 :  {68}
var unique = {};
// Assume I copy and pasted alreadyFound here
var alreadyFound = ...;
for (var object in data) {
  // Iterate through ids in each object in data
  for (var id in object) {
    // Remove this entry if it's already found
    if (alreadyFound(id)) {
      delete object[id];
    }
  }
}

谢谢你们的回答,我真的很感谢你们抽出时间

我进一步搜索,发现Lodash开发者帮助我找到了这个片段

var数据={
精确匹配:{
104: {
供应商编号:104
}
},
匹配四位数字:{
104: {
供应商编号:104
},
68: {
供应商编号:68
}
},
匹配两位数字:{
104: {
供应商编号:104
},
68: {
供应商编号:68
},
103: {
供应商编号:103
},
999: {
供应商识别码:999
}
}
};
var arr_match_four_digits=u.difference(u.keys(data.match_four_digits),u.keys(data.exact_match));
var arr_match_two_digits=u.difference(u.keys(data.match_two_digits),u.keys(data.match_two_digits),u.keys(data.exact_match));
$('#output1').html(JSON.stringify(data));
$('#output2').html(JSON.stringify(u.pick(data.match_四位数,arr_四位数));
$('#output3').html(JSON.stringify(u.pick(data.match_两位数,arr_匹配_两位数))

数据
arr\u匹配四位数字
匹配两个数字
您是否尝试过使用
.keys
?相同的对象引用,或使用相同键的新对象?@AdamBoduch谢谢,我已经找到了解决方案。.谢谢您的..key提示!
var unique = {};
// Assume I copy and pasted alreadyFound here
var alreadyFound = ...;
for (var object in data) {
  // Iterate through ids in each object in data
  for (var id in object) {
    // Remove this entry if it's already found
    if (alreadyFound(id)) {
      delete object[id];
    }
  }
}