Underscore.js - 获取唯一的属性值

13

我最近才发现了underscore.js的强大之处,对其方法还很陌生,恳请给予建议:

如何从以下代码实现此功能:

[
    [{
        "name": "Type 2",
        "id": 14
    }],
    [{
        "name": "Type 1",
        "id": 13
    }, {
        "name": "Type 3",
        "id": 15
    }],
    [{
        "name": "Type 2",
        "id": 14
    }],
    [{
        "name": "Type 1",
        "id": 13
    }]
]

对此:

["Type 1","Type 2","Type 3"]

非常感谢任何建议。


你尝试过什么吗?这应该很简单。 - Ram
@BlackSheep - 我能够在几个步骤中完成这个任务。但是我缺少了flatten方法,这使得链式操作成为可能。 - Iladarsda
5个回答

28
_(data).chain().flatten().pluck('name').unique().value()
  • 将嵌套列表转换为平面列表
  • 从列表中的每个对象中获取 name 属性,并使其唯一。

1
在underscore/lo-dash中链接方法与嵌套方法(如McGarnagle的答案)相比,是否有特别的优点?还是纯粹为了美观/代码清晰性? - nverba
在lodash中,如果您将多个方法链接在一起,则使用_()创建包装器更有效率;如果只执行一个(或两个)操作,则效率较低。请针对每种情况进行自己的基准测试。 - kmiyashiro

10
  • 首先使用flatten函数,将嵌套数组转换为扁平数组。
  • 然后使用pluck函数,获取“name”值作为一个数组。
  • 最后使用uniq函数。
_.uniq(_.pluck(_.flatten(items), "name"))

Fiddle


3
_.uniq(_.pluck(x,'name'));

以上代码足以提取不同的“name”属性。

2
var arr = _.uniq(_.map(_.flatten(array), function(e) {
    return e.name;
}));

1
简单的方法:

1. 使用 _.map 获取所有名称

var names = _.map(items, function(item) { return item.name});

从这些名称中获取 _.uniq。
var uniqueNames = _.uniq(names);

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