Javascript 按多个键对对象数组进行分组

Javascript 按多个键对对象数组进行分组,javascript,arrays,sorting,group-by,Javascript,Arrays,Sorting,Group By,问这个问题我感到很尴尬,因为我应该知道如何解决这个问题,但我正在通过多个键对一组对象进行分组 以下是数据: [ { "car": "audi", "type": "A6", "style": "Avant", "year": "1996" }, { "car": "audi", "type": "A4", "style": "2",

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

以下是数据:

[
      {
        "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();

,但当涉及到汽车每年的样式和类型时,我最终会得到不完整的数据。

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

var数据=[{汽车:“奥迪”,车型:“A6”,车型:“前卫”,年份:1996},{汽车:“奥迪”,车型:“A4”,车型:2,年份:2006},{汽车:“奥迪”,车型:“A4”,车型:“LW12”,年份:2006},{汽车:“奥迪”,车型:80,车型:“GLE”,年份:1975},{汽车:“奥迪”,车型:“A6”,车型:“前卫L”,年份:1996},{汽车:“奥迪”,车型:“A6”,车型:“A6”,车型:“3.2多电子”,年份:2006}],
钥匙=[“汽车”、“年份”、“类型”],
结果=[];
data.forEach(函数(a){
键。减少(功能(r,k){
var o={};
如果(!r[a[k]]){
r[a[k]={{}:[]};
o[a[k]]=r[a[k].\uu;
r、 _u.推(o);
}
返回r[a[k]];
}(这是一种风格);
},{结果});
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
这里有一个(稍微冗长的)解决方案,它可以精确地生成您想要的JSON对象形状,并通过无限键进行分组:

var-cars=[{
“汽车”:“奥迪”,
“类型”:“A6”,
“风格”:“前卫”,
“年份”:“1996年”
}, {
“汽车”:“奥迪”,
“类型”:“A4”,
“风格”:“2”,
“年份”:“2006年”
}, {
“汽车”:“奥迪”,
“类型”:“A4”,
“风格”:“L W12”,
“年份”:“2006年”
}, {
“汽车”:“奥迪”,
“类型”:“80”,
“风格”:“格力”,
“年份”:“1975年”
}, {
“汽车”:“奥迪”,
“类型”:“A6”,
“风格”:“前卫L”,
“年份”:“1996年”
}, {
“汽车”:“奥迪”,
“类型”:“A6”,
“风格”:“3.2 Multitronic”,
“年份”:“2006年”
}, ];
函数groupBy(列表、属性){
返回列表。减少((分组,项目)=>{
变量键=项目[prop];
删除项目[prop];
if(groupped.hasOwnProperty(键)){
分组[键]。推送(项);
}否则{
分组[键]=[项];
}
返回分组
}, {});
}
函数组子键(obj、属性、ProIndex){
var grouppedObj=groupBy(对象,属性[ProIndex]);
Object.key(grouppedObj).forEach((key)=>{
if(ProIndexitem[properties[proindex+1]]
}
});
返回组pedobj;
}
函数groupByProperties(列表、属性){
返回groupsubkey(列表,属性,0);
}

log(groupByProperties(cars,['car','year','type','style'])请添加您的尝试。已更新,但我正在尝试不使用lodash。在这种情况下,我的头脑已经崩溃。你介意把你的代码一步一步地看一下吗?我特别好奇的是{uuz:result}被作为reduce()的初始值传入。实际上,这个方法基本上与reduce()类似,只需要键就可以更容易地访问,并且在没有回调的情况下更容易创建结果。对于哈希表,您可以深入了解方法和分组功能。这个看起来也很棒。我无法用子键来进行分组,结果会是空数组。我很感谢你抽出时间把这件事整理好。