【问题标题】:Remove duplicates from object array - Underscore从对象数组中删除重复项 - 下划线
【发布时间】:2013-11-11 20:27:23
【问题描述】:

试图让 _.uniq() 处理以下结构:

[
    {'x' : 1, 'y': 2},
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]

结果应该在哪里:

[
    {'x' : 1, 'y': 2},
    {'x' : 2, 'y': 3},
    {'x' : 2, 'y': 4},
    {'x' : 3, 'y': 4}
]

即删除重复项。我想避免字符串化,因为我只需要将每个解析回一个 JSON 对象。

任何帮助将不胜感激。

编辑:在下面查看马特的解决方案,我遗漏了一些我认为的东西 - 这不起作用。如果我记录 a 和 b 的值,我会看到

_.uniq($scope.validNotes, function (a, b) {
    console.log(a, b);
    return a.x === b.x && a.y === b.y;
});


Object {x: 2, y: 3} 0 
Object {x: 1, y: 0} 1 
Object {x: 2, y: 3} 2 
Object {x: 3, y: 2} 3 
Object {x: 4, y: 2} 4
Object {x: 5, y: 1} 5

这显然意味着我永远找不到任何骗子

【问题讨论】:

标签: javascript underscore.js


【解决方案1】:

因为两个对象不是=====,只是因为它们有相同的键,所以你需要使用[iterator] argument of the uniq() function;

_.uniq(myArray, function (item) {
    return item.x + item.y;
});

请注意,您需要返回一个唯一的字符串组合;考虑{ x: 11, y: 1 }{ x: 1, y: 11 } 的情况;我的代码将两者都解析为111,并将它们视为相同。

类似:

_.uniq(myArray, function (item) {
    return 'x:' + item.x + 'y:' + item.y;
});

... 会更有弹性,但这当然取决于您的数据值。

【讨论】:

  • @Nathan: 哎呀,抱歉……没有考虑迭代器的参数。现在试试?
  • 太棒了,谢谢。不确定迭代器是如何工作的,现在说得通了。一旦我意识到我的数据也不正确,效果会更好
  • 哈哈,很高兴它有帮助:)。
【解决方案2】:

如果您的 JSON 中有抽象数据结构,最好使用 stringify 将数组元素与字符串一一比较。因为您在每个数组元素中都有新对象,所以每个字面量对象表示法,即 {} 都会在 javascript 语言中创建新对象,并且它不会具有相同的属性。

但是,如果你有像 x,y 这样的结构,请使用 Matt answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2017-04-10
    • 2016-03-12
    相关资源
    最近更新 更多