如何使用下划线获取基于对象属性的唯一数组

el_*_*_le 40 javascript underscore.js

我有一个对象数组,我想从它获得一个新的数组,它只是基于一个属性是唯一的,有一个简单的方法来实现这一点吗?

例如.

[ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]
Run Code Online (Sandbox Code Playgroud)

将导致名称= bill的2个对象被删除一次.

Col*_*inE 64

使用uniq功能

var destArray = _.uniq(sourceArray, function(x){
    return x.name;
});
Run Code Online (Sandbox Code Playgroud)

来自文档:

生成数组的无副本版本,使用===来测试对象相等性.如果您事先知道数组已排序,则为isSorted传递true将运行更快的算法.如果要基于转换计算唯一项,请传递迭代器函数.

在上面的示例中,函数使用对象名称来确定唯一性.

  • 你也可以做`_.uniq(sourceArray,'name')` (19认同)
  • 嗨,是否有可能检查多个属性的唯一性,例如上面的例子用id和name两者来表示? (11认同)
  • lodash uniq 在这里中断!我花了一个小时来调试。你必须使用 uniqBy 因为 lodash 并不是下划线的替代品,它在一些事情上默默地失败了。 (2认同)

Eir*_*and 8

如果您喜欢在没有Lodash的情况下自己做事,并且没有得到详细信息,请尝试使用可选的uniq by属性的uniq过滤器:

const uniqFilterAccordingToProp = function (prop) {
    if (prop)
        return (ele, i, arr) => arr.map(ele => ele[prop]).indexOf(ele[prop]) === i
    else
        return (ele, i, arr) => arr.indexOf(ele) === i
}
Run Code Online (Sandbox Code Playgroud)

然后,像这样使用它:

const obj = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]
obj.filter(uniqFilterAccordingToProp('abc'))
Run Code Online (Sandbox Code Playgroud)

或者对于普通数组,只需省略参数,同时记住要调用:

[1,1,2].filter(uniqFilterAccordingToProp())


use*_*231 6

如果你想检查所有的属性,那么lodash 4附带_.uniqWith(sourceArray,_.isEqual)

  • 2个属性怎么样,但不是所有属性? (6认同)

Mud*_*auf 5

更好,更快捷的方法

var table = [
  {
    a:1,
    b:2
  },
  {
    a:2,
    b:3
  },
  {
    a:1,
    b:4
  }
];

let result = [...new Set(table.map(item => item.a))];
document.write(JSON.stringify(result));
Run Code Online (Sandbox Code Playgroud)

在这里找到

  • 这与 OP-s 请求略有不同,因为它返回“a”的唯一值,而我们应该获取具有唯一“a”属性的“table”的所有子项。结果差异为“[1, 2]”(当前)与“[{ a: 1, b: 2 }, { a: 2, b: 3 }]”(预期)。 (2认同)