我有这个对象数组,我希望它们按特定键分组,在本例中为标签
var items = [
{id: 0, tags: ["a"], name: "foo"},
{id: 1, tags: [], name: "bar"},
{id: 2, tags: ["a"], name: "bazz"},
{id: 3, tags: ["b"], name: "wah"},
{id: 4, tags: ["c"], name: "ikr"},
{id: 5, tags: ["a"], name: "wtf"},
{id: 6, tags: ["a","b"], name: "gtg"},
{id: 7, tags: ["c"], name: "afk"}
]
所以我使用了下划线,如下所示:
var groupItems = _.groupBy(items, function(obj) {
return obj.tags;
});
问题在于:
{
"a": [
{"id": 0,"tags": ["a"],"name": "foo"},
{"id": 2,"tags": ["a"],"name": "bazz"},
{"id": 5,"tags": ["a"],"name": "wtf"}
],
"": [
{"id": 1,"tags": [],"name": "bar"}
],
"b": [
{"id": 3,"tags": ["b"],"name": "wah"}
],
"c": [
{"id": 4,"tags": ["c"],"name": "ikr"},
{"id": 7,"tags": ["c"],"name": "afk"}
],
"a,b": [
{"id": 6,"tags": ["a","b"],"name": "gtg"}
]
}
如果您还注意到,那些拥有多个标签的人会从数组 tags
创建一个 joined
键,这是一个非常不受欢迎的结果。当它们有多个标签
时,如何按标签
对它们进行分组并复制数据
最佳答案
假设当一个项目有多个标签时,您希望每个标签下有重复的条目 _.groupBy
将不会执行您想要的操作,因为它只是将集合拆分(不会重复条目)。
相反,您需要手动循环遍历项目,然后遍历每个项目的标签并为您构建列表(如果需要,可以使用 _.each
):
var items = [
{id: 0, tags: ["a"], name: "foo"},
{id: 1, tags: [], name: "bar"},
{id: 2, tags: ["a"], name: "bazz"},
{id: 3, tags: ["b"], name: "wah"},
{id: 4, tags: ["c"], name: "ikr"},
{id: 5, tags: ["a"], name: "wtf"},
{id: 6, tags: ["a","b"], name: "gtg"},
{id: 7, tags: ["c"], name: "afk"}
];
var groupItems = {};
for (var i = 0, item; item = items[i]; i++) {
for (var t = 0, tag; tag = item.tags[t]; t++) {
// If we do not have an array for our tag, add one
groupItems[tag] = groupItems[tag] || [];
// Push out item onto the tag's list in our groupItems
groupItems[tag].push(item);
}
}
这会给你:
{
"a": [
{"id": 0,"tags": ["a"],"name": "foo"},
{"id": 2,"tags": ["a"],"name": "bazz"},
{"id": 5,"tags": ["a"],"name": "wtf"},
{"id": 6,"tags": ["a","b"],"name": "gtg"}
],
"b": [
{"id": 3,"tags": ["b"],"name": "wah"},
{"id": 6,"tags": ["a","b"],"name": "gtg"}
],
"c": [
{"id": 4,"tags": ["c"],"name": "ikr"},
{"id": 7,"tags": ["c"],"name": "afk"}
]
}
关于javascript - 按键对对象数组进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29901544/