Javascript 根据特定字段对对象数组进行分组
我有一个对象数组。我想按特定字段对它们进行分组Javascript 根据特定字段对对象数组进行分组,javascript,arrays,group-by,Javascript,Arrays,Group By,我有一个对象数组。我想按特定字段对它们进行分组 [ { "name": "JOHN", "type": 1, "sum": 5 }, { "name": "SERA", "type": 1, "sum": 43
[
{
"name": "JOHN",
"type": 1,
"sum": 5
},
{
"name": "SERA",
"type": 1,
"sum": 43
},
{
"name": "SERA",
"type": 2,
"sum": 129
},
{
"name": "JOHN",
"type": 2,
"sum": 200
}
]
我希望按名称分组属性的输出如下所示
{
// Group #1
"JOHN": [
{
"type": 2,
"sum": 200
}
{
"type": 1,
"sum": 5
}
],
// Group #2
"SERA":[
{
"type": 1,
"sum": 43
},
{
"type": 2,
"sum": 129
},
]
}
我使用了嵌套循环,但不幸的是,执行速度很慢,并且没有给出正确的结果。正如您所提到的,我们可以使用对象而不是数组作为最外层的包装器。也可以将一个对象内部交换为一个数组,这是一个可能的解决方案
var data=[{“name”:“JOHN”,“type”:1,“sum”:5},{“name”:“SERA”,“type”:1,“sum”:43},{“name”:“SERA”,“type”:2,“sum”:129},{“name”:“JOHN”,“type”:2,“sum”:200};
var newData={};
data.forEach((项目)=>{
如果(!(newData中的项['name'])){
newData[项目['name']]=[];
}
newData[项目['name']]。推送(
{
“类型”:项[“类型”],
“总和”:项目[“总和”]
}
);
});
console.log(newData)代码>建议的输出结构无效,但是使用可以创建一个对象,其中所有属性都是对象数组:
const数据=[
{
“姓名”:“约翰”,
“类型”:1,
“总和”:5
},
{
“姓名”:“血清”,
“类型”:1,
“总和”:43
},
{
“姓名”:“血清”,
“类型”:2,
“总和”:129
},
{
“姓名”:“约翰”,
“类型”:2,
“总和”:200
}
];
const result=data.reduce((c,{name,type,sum})=>{
c[name]=c[name]| |[];
c[name].push({type,sum});
返回c;
}, {});
控制台日志(结果)
您可以使用此函数,它利用Array.prototype.reduce
将初始数据转换为另一个数组结构
let数据=[
{
“姓名”:“约翰”,
“类型”:1,
“总和”:5
},
{
“姓名”:“血清”,
“类型”:1,
“总和”:43
},
{
“姓名”:“血清”,
“类型”:2,
“总和”:129
},
{
“姓名”:“约翰”,
“类型”:2,
“总和”:200
}
];
功能分组依据(数据、字段){
让fieldValues=[…数据].reduce((acc,当前)=>{
返回acc.concat(当前[字段]);
},[])。筛选器((值、索引、自身)=>{
返回self.indexOf(value)==索引;
});
让结果=字段值。减少((acc,项目)=>{
let items=[…data].filter(el=>{
返回el.name==项目;
});
items.forEach(i=>delete i.name);
返回Object.assign(acc,{[item]:items});
}, {});
返回结果;
}
log(groupedBy(数据,“名称”)代码>使用forEach
,解构
和??
运算符的另一种方式
const merge=(arr)=>{
常量obj={};
arr.forEach(({name,…rest})=>(obj[name]??=[]).push(rest));
返回obj;
};
常数数据=[
{
姓名:“约翰”,
类型:1,
总数:5,
},
{
名称:“血清”,
类型:1,
总数:43,
},
{
名称:“血清”,
类型:2,
总数:129,
},
{
姓名:“约翰”,
类型:2,
总数:200,
},
];
console.log(合并(数据))
输出是否也可以完全包装在{}
括号中?那么完整的结果是一个对象而不是一个数组?我想不然就不是了possible@Saeed输出不是语法上的correct@caramba是的,它可以完全包装在{}
括号中。