Lodash/Underscore: 比较两个对象并去重

5
如下图所示,我有一些返回的JSON数据data,其中包含三个对象,每个对象都包含客户端ID => 数据。
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 吗? - Jonathan Allard
同一个对象的引用,还是具有相同键的新对象? - Adam Boduch
@AdamBoduch 谢谢,我已经找到解决方案了。 - numediaweb
3个回答

9

看起来你想要对比键(或者更准确地说,使用_.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]]

感谢提供的.key提示! - numediaweb

1
我会创建一个名为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];
    }
  }
}

1

谢谢大家的回答,我非常感激您们的时间。

我进一步搜索了并找到了Lodash开发者发布的this post,这帮助我编写了以下片段;

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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接