javascript - 按键对对象数组进行分组

标签 javascript arrays object grouping

我有这个对象数组,我希望它们按特定键分组,在本例中为标签

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/

相关文章:

java - 如何使用 for 循环更新数据库并获取最后一个序列值

物体体积计算/估计

javascript - 如何提交由动态列和行组成的表单

javascript - nodemon 监视目录以进行更改

c - 如何在C中更改数组的大小?

c - 从 C 中的函数返回数组

javascript - 如何用zerofill显示MySQL值

javascript - Gruntfile Jade 任务编译奇怪的模板

javascript - Ramda,从数组中提取一个 json 索引

javascript - 按键数对对象数组进行排序 (JavaScript)