【发布时间】:2021-03-17 07:46:22
【问题描述】:
我想转换这个数组:
[{
department: 'HR',
person: 'Tom'
},{
department: 'Finance',
person: 'Peter'
},{
department: 'HR',
person: 'Jane'
}];
进入这个,按department分组人并更改密钥
[{
role: 'HR',
people: ['Tom','Jane']
},{
role: 'Finance',
people: ['Peter']
}]
我使用这种看起来很流行并且效果很好的技术,我不确定它是否有名字。
const data = [{department: 'HR', person: 'Tom'},{department: 'Finance',person: 'Peter'},{department: 'HR',person: 'Jane'}];
function groupPeopleByDepartmentWithObj(data) {
const obj = {};
for (const { department, person} of data) {
if (!obj[department]) {
obj[department] = { role: department, people: []};
}
obj[department].people.push(person);
}
return Object.values(obj);
}
console.log(groupPeopleByDepartmentWithObj(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用 ES6 Map 对象我可以这样做
const data = [{department: 'HR', person: 'Tom'},{department: 'Finance',person: 'Peter'},{department: 'HR',person: 'Jane'}];
function groupPeopleByDepartmentWithMap(data) {
const mapper = new Map()
for (const { department, person} of data) {
if (!mapper.has(department)) {
mapper.set(department, { role: department, people: []})
}
mapper.get(department).people.push(person)
}
return Array.from(mapper.values())
}
console.log(groupPeopleByDepartmentWithMap(data))
.as-console-wrapper { max-height: 100% !important; top: 0; }
这种方法在任何方面都更好吗,还有其他方法可以使用Map 来获得相同的结果吗?
【问题讨论】:
-
当你说
Is this approach better是什么意思?您是否正在尝试(可能过早地)优化代码的性能?还是您正在寻找错误? -
也许这个问题最好放在codereview.stackexchange.com
-
我的意思是,使用地图来完成这项任务有什么意义吗?
-
您在征求意见,而基于意见的问题不适合 SO
-
如果您有
department的数值,则使用地图将保留原始顺序,而使用对象则不会(例如:如果将department更改为具有,您将获得两个不同的顺序2而不是'HR'和1而不是'Finance')。如果department持有对象类型,您还将在两者之间得到不同的结果。在速度方面,我听说使用地图会更快,但我自己从未测试过,因为这样的事情的速度真的不应该受到关注
标签: javascript arrays ecmascript-6 javascript-objects