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
}, {})