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

标签 javascript arrays sorting group-by

我对问这个问题感到尴尬,因为我应该知道如何解决这个问题,但我正在通过多个键对对象数组进行分组。

这是数据:

[
      {
        "car": "audi",
        "type": "A6",
        "style": "Avant",
        "year": "1996"
      },
      {

        "car": "audi",
        "type": "A4",
        "style": "2",
        "year": "2006"
      },
      {

        "car": "audi",
        "type": "A4",
        "style": "L W12",
        "year": "2006"
      },
      {

        "car": "audi",
        "type": "80",
        "style": "GLE",
        "year": "1975"
      },
      {

        "car": "audi",
        "type": "A6",
        "style": "Avant L",
        "year": "1996"
      },
      {
        "car": "audi",
        "type": "A6",
        "style": "3.2 Multitronic",
        "year": "2006"
      },
]

我一直试图生成但收效甚微的内容如下:

 [{
   "audi": [{
     "1996": {
       "A6": ["Avant, Avant L"]
     }
   }, {
     "2006": }
       "A6": ["3.2 Multitronic"],
       "A4": ["L W12", "2"]
     }
   }
   ....
 }]

架构是:

{
    "car1": [{
        "year1": {
            "style1": ["trim1", "trim2"],
            "style2": ["trim1", "trim2"]
        },
        "year1": {
            "style1": ["trim1", "trim2"],
            "style2": ["trim1", "trim2"]
        }
    }],
    "car2": [{
        "year1": {
            "style1": ["trim1", "trim2"],
            "style2": ["trim1", "trim2"]
        },
        "year2": {
            "style1": ["trim1", "trim2"],
            "style2": ["trim1", "trim2"]
        }
    }]
}

我已经用 lodash 尝试过以下操作

  let result = _.chain(carData)
    .groupBy('car')
    .toPairs()
    .map(function(curr) {
        return _.zipObject(['car', 'year'], curr);
    })
    .value();

This gets me part of the way ,但是当涉及到汽车每年的款式和类型时,我最终得到的数据不完整。

最佳答案

您可以对给定属性使用哈希对象和嵌套方法。

var data = [{ car: "audi", type: "A6", style: "Avant", year: 1996 }, { car: "audi", type: "A4", style: 2, year: 2006 }, { car: "audi", type: "A4", style: "L W12", year: 2006 }, { car: "audi", type: 80, style: "GLE", year: 1975 }, { car: "audi", type: "A6", style: "Avant L", year: 1996 }, { car: "audi", type: "A6", style: "3.2 Multitronic", year: 2006 }],
    keys = ['car', 'year', 'type'],
    result = [];

data.forEach(function (a) {
    keys.reduce(function (r, k) {
        var o = {};
        if (!r[a[k]]) {
            r[a[k]] = { _: [] };
            o[a[k]] = r[a[k]]._;
            r._.push(o);
        }
        return r[a[k]];
    }, this)._.push(a.style);
}, { _: result });
   
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 按多个键对对象数组进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448869/

相关文章:

javascript - 悬停时在 <div> 中填充背景颜色作为从中心点开始向外移动的动画

Javascript根据排序属性对树级别进行排序

assembly - 快速的寄存器内字节排序?

python - 渲染 3D 数组中的可见体素,无需全部迭代

arrays - 按特定的自定义字段对 Doctrine ArrayCollection 进行排序

javascript - 如何知道两个jquery对象是否指向同一个元素

javascript - jQuery - 悬停时淡入淡出动画

javascript - 登录表单提交按钮不起作用

Javascript - 从 JSON 数组中删除对象

c - 从文件读取并存储到C中动态分配的二维数组中