Javascript 对象数组到按属性分组的对象数组

Javascript 对象数组到按属性分组的对象数组,javascript,arrays,object,grouping,Javascript,Arrays,Object,Grouping,我正在努力想出一种有效的方法,将对象数组按属性分组到另一个数组中 我从相关的问题和答案中找到了一些解决方案,但仍在努力实现所需的数据结构 样本数据输入数据(取自) 以下是我努力实现的目标: const carsTransformed = [{ 'audi': [{ 'model': 'r8', 'year': '2012' }, { 'model': 'rs5', 'year': '2013' },], }, { 'ford': [{ 'm

我正在努力想出一种有效的方法,将对象数组按属性分组到另一个数组中

我从相关的问题和答案中找到了一些解决方案,但仍在努力实现所需的数据结构

样本数据输入数据(取自)

以下是我努力实现的目标:

const carsTransformed = [{
  'audi': [{
    'model': 'r8',
    'year': '2012'
  }, {
    'model': 'rs5',
    'year': '2013'
  },],
},
{
  'ford': [{
    'model': 'mustang',
    'year': '2012'
  }, {
    'model': 'fusion',
    'year': '2015'
  }],
},
{
  'kia': [{
    'model': 'optima',
    'year': '2012'
  }]
}
];
到目前为止,我试图使用

const arrayGroupBy = (array, property) => {
  return array.reduce((map, object) => {
    (map[object[property]] = map[object[property]] || []).push(object);
    return map;
  }, {});
};
尝试通过
object.entries(obj.map()
操作结果对象,得到一些奇怪的结果:(

我会很感激任何关于如何实现这一点的想法

编辑:尝试不使用任何第三方库

let group = {};
cars.forEach((c) => {
    if (!group[c.make]) group[c.make] = [];
    group[c.make] = [...group[c.make], cars.filter(m => m.make === c.make)];
});
console.log(group);
或者您可以通过
lodash
库来实现这一点


\uu.mapValues(u.groupBy(cars,'make'));

如果需要对象,这里是解决方案:

const carsTransformedObject = cars.reduce((acc, next) => {
  if (acc[next.make]) {
    acc[next.make].push({model: next.model, year: next.year})
  } else {
    acc[next.make] = [{model: next.model, year: next.year}]
  }
  return acc
}, {})
如果希望此对象像显示的那样位于数组中,只需执行以下操作: 常量carsTransformed=[carsTransformedObject]

就这样可能是这样的:

const cars=[{
“制造”:“奥迪”,
“型号”:“r8”,
“年份”:“2012”
}, {
“制造”:“奥迪”,
“型号”:“rs5”,
“年份”:“2013”
}, {
“制造”:“福特”,
“模型”:“野马”,
“年份”:“2012”
}, {
“制造”:“福特”,
“模型”:“融合”,
“年份”:“2015”
}, {
‘make’:‘kia’,
“模型”:“optima”,
“年份”:“2012”
}, ];
已形成功能车(_辆车){
var out={};
用于(var钥匙插入车){
var car\u brand=\u cars[key]。制造;
如果(!out[汽车品牌]){
out[汽车品牌]=[];
}
删除(_cars[key].make);
出[汽车品牌]。推(汽车[钥匙]);
}
返回;
}

console.log(carsTransformed(cars));
这不是很紧凑,但是使用delete可以从对象中删除属性

constgroupby=(对象,属性='id')=>
对象项(对象减少((映射,项)=>{
变量键=项[属性]
映射[键]=映射[键]| |[]
const cleaned=Object.assign({},item)
删除[属性]
映射[键]。推送(已清理)
返回图
}, {}))
.map([k,a])=>({
[k] :a
}))
常数车=[{
“制造”:“奥迪”,
“型号”:“r8”,
“年份”:“2012”
}, {
“制造”:“奥迪”,
“型号”:“rs5”,
“年份”:“2013”
}, {
“制造”:“福特”,
“模型”:“野马”,
“年份”:“2012”
}, {
“制造”:“福特”,
“模型”:“融合”,
“年份”:“2015”
}, {
‘make’:‘kia’,
“模型”:“optima”,
“年份”:“2012”
}, ];
console.log(groupBy(cars,'make'))
let cars=[{
“制造”:“奥迪”,
“型号”:“r8”,
“年份”:“2012”
}, {
“制造”:“奥迪”,
“型号”:“rs5”,
“年份”:“2013”
}, {
“制造”:“福特”,
“模型”:“野马”,
“年份”:“2012”
}, {
“制造”:“福特”,
“模型”:“融合”,
“年份”:“2015”
}, {
‘make’:‘kia’,
“模型”:“optima”,
“年份”:“2012”
}, ];
让rqObj=汽车。减少((acc,ele)=>{
让nObj=JSON.parse(JSON.stringify(ele));
删除nObj['make'];
设obj={[ele.make]:[nObj]};
让pos=acc.findIndex(el=>Object.keys(el)[0]==ele.make);
(位置==-1)?附件推送(obj):附件[pos][ele.make]=[…附件[pos][ele.make],…附件[ele.make];
返回acc;
},[])

console.log(rqObj)
谢谢你的回答。当我需要一个对象数组时,它仍然会返回一个对象。谢谢你的回答,它仍然会返回一个对象,尽管你希望它隐藏在数组中,但这是一个简单的更改。添加
.map([k,a])=>({[k]:a}))
将其放入数组编辑它以返回数组而不仅仅是对象
const carsTransformed = [...new Set(cars.map(c => c.make))].map(make => {
    return {
        [make]: cars.filter(cs => cs.make === make)
    }
})
const carsTransformedObject = cars.reduce((acc, next) => {
  if (acc[next.make]) {
    acc[next.make].push({model: next.model, year: next.year})
  } else {
    acc[next.make] = [{model: next.model, year: next.year}]
  }
  return acc
}, {})