【问题标题】:Lodash choose which duplicates to rejectLodash 选择要拒绝的重复项
【发布时间】:2016-10-10 15:29:03
【问题描述】:

我有对象数组,对象有属性“a”、“b”和“c”。 现在我需要过滤掉具有“a & b”唯一值的对象。 然而,c 在保留哪些对象和拒绝哪些对象方面发挥作用。

如果我对属性 a 和 b 执行 uniqBy,我将盲目拒绝其他对象。它会将遇到的第一个对象保留在数组中,并拒绝所有其他重复对象。

如果您需要对该问题进行更多说明,请告诉我。

这就是我根据两个属性找到 uniq 对象的方式。 var uniqArray= _.uniqBy(obj, function(elem) { return [elem.a, elem.b].join(); })

lodash uniq - choose which duplicate object to keep in array of objects

我们有更好的解决方案吗?

这是输入和预期输出的示例 输入: var arrayOfObj = [{a:1, b:1, c:2}, {a:1,b:1,c:1}, {a:2, b:2,c:2}]; 输出:arrayOfObj = [{a:1,b:1,c:1}, {a:2, b:2,c:2}];不应该有任何重复的 a1,b1 组合

【问题讨论】:

  • 输入数据和预期结果的示例会很好。
  • 当然。输入: var arrayOfObj = [{a:1, b:1, c:2}, {a:1,b:1,c:1}, {a:2, b:2,c:2}];输出:arrayOfObj = [{a:1,b:1,c:1}, {a:2, b:2,c:2}];不应该有任何重复的 a1,b1 组合。
  • 在我的例子中,''c" 是时间戳,所以如果我按 desc 顺序排序,即最新的时间戳在前,我不确定它是否会正确排序。
  • 您能否添加一个输入和预期输出的示例?谢谢。

标签: lodash


【解决方案1】:

根据 Lodash 文档,结果值的顺序由它们在数组中出现的顺序决定。因此,您需要使用 'c' 属性对数组进行排序以获得预期结果。

为此,您可以使用 _.sortBy。它根据属性或迭代对象按 asc 顺序对集合进行排序。我认为您的问题可以直接使用属性来解决,但如果需要,您可以使用函数来提供更准确的比较器。

之后,您只需执行 uniqBy 操作并检索结果:

var res = _(arrayOfObj)
  .orderBy('c')
  .uniqBy('a', 'b')
  .value();

console.log(res);

这是fiddle

正如我在 cmets 中所读到的,您的“c”属性是一个时间戳。如果你想从最新到最新排序,你可以传递一个 iteratee 来排序,以便通过 'c' 反转自然顺序:

var res = _(arrayOfObj)
  .orderBy(function(obj) {
    return -(+obj.c);
  })
  .uniqBy('a', 'b')
  .value();

console.log(res);

您可以在以前的fiddle 的此更新中查看它。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    有助于了解实际数据是什么以及您想用它实现什么。这里有一个想法:根据 a 和 b 对对象进行分组,然后从每个分组中根据 c 选择一项。

    var arrayOfObj = [
    {a:1, b:1, c:2}, 
    {a:1, b:1, c:1}, 
    {a:2, b:2, c:2}
    ];
    
    var result = _.chain(arrayOfObj)
        .groupBy(function (obj) {
            return obj.a.toString() + obj.b.toString();
        })
        .map(function (objects) {
    
            //replace with code to select the right item based on c
            return _.head(objects);
    
        }).value();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多