繁体   English   中英

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

[英]lodash/underscore; compare two objects and remove duplicates

正如您在下图中看到的,我有一些带有三个对象的返回json data ; 每个包含客户端id =>数据。

返回json数据

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

如何根据之前的“修剪”或删除重复的对象? 就像是:

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

我尝试了_.difference但没有工作(也许是因为它是数组而不是对象?):

var exact_match = data.exact_match,
    match_four_digits = _.difference(data.match_4, data.exact_match),
    match_two_digits = _.difference(data.match_2, data.exact_match, data.match_4),

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

更新

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

看起来你想要扩展键(或者更确切地说,它是有效的 - _.keys

_.difference(
  _.keys({104: 1, 102: 3, 101: 0}), // ["104", "102", "101"]
  _.keys({104: 1, 102: 3}) // ["104", "102"]
)
// [ "101" ]

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

_.difference(
  _.pairs({104: 1, 102: 3, 101: 0}), // [["104",1], ["102",3], ["101",0]]
  _.pairs({104: 1, 102: 2}) // [["104",1], ["102",2]]
)
// [["102", 3], ["101", 0]]

我会创建一个名为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 / underscore方法,但这些方法可能效率低,具体取决于您如何使用它们(以及它们如何实现),这应该在线性时间内运行。

看起来对于您的特定用例,完整的解决方案将是这样的:

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 data = { exact_match: { 104: { supplier_id: 104 } }, match_four_digits: { 104: { supplier_id: 104 }, 68: { supplier_id: 68 } }, match_two_digits: { 104: { supplier_id: 104 }, 68: { supplier_id: 68 }, 103: { supplier_id: 103 }, 999: { supplier_id: 999 } } }; var arr_match_four_digits = _.difference(_.keys(data.match_four_digits), _.keys(data.exact_match)); var arr_match_two_digits = _.difference(_.keys(data.match_two_digits), _.keys(data.match_four_digits), _.keys(data.exact_match)); $('#output1').html(JSON.stringify(data)); $('#output2').html(JSON.stringify(_.pick(data.match_four_digits, arr_match_four_digits))); $('#output3').html(JSON.stringify(_.pick(data.match_two_digits, arr_match_two_digits))); 
 <script src="https://cdn.rawgit.com/lodash/lodash/3.3.1/lodash.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> data <pre><code><div id="output1"></div></code></pre> arr_match_four_digits <pre><code><div id="output2"></div></code></pre> match_two_digits <pre><code><div id="output3"></div></code></pre> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM