就很好奇,js 话题下总有层出不穷的数组/JSON 遍历/查找/转化的问题。
问题模板里不是有几个项么?自己做过什么尝试?都给提问者删了。
好的问题是要问到根本上,让人一眼看出你疑惑的点是什么。同样的,好的回答是要能授人以渔,而不是甩一段能解决这个问题的代码不管你是否理解就完事。
这次的 obj 可能长这样,下次的可能是另外的样子;这次的需求是保留一个分数最高的,下次可能是用数组保存这个人的所有分数, 又或者是统计相同名字分数一共是多少。需求场景天天变,有扎实的基本功才能以不变应万变。
回到问题,你如果稍微懂一点 SQL,应该知道这个就类似于 group by 加 max。JS 数组没有 groupBy 方法,我们可以自己实现一个,然后做一下 max 就ok了。
// 这个 groupBy 函数是通用的
function groupBy(arr, by) {
return arr.reduce((groups, item) => {
// 获取 item 的分组的 key
const key = by(item);
// 看看这个组是不是已经存在
let group = groups.find(g => g.key === key);
if(!group) {
// 不存在就创建一个新组
group = {key, items: []};
groups.push(group);
}
// item 放入组中
group.items.push(item);
return groups;
}, []);
}
let arr = [
{'名字': '小明', '分数': 100},
{'名字': '小明', '分数': 98},
{'名字': '小红', '分数': 100},
{'名字': '小白', '分数': 100},
{'名字': '小红', '分数': 95},
];
// 先按名字分组
groupBy(arr, item => item['名字'])
.map(group => {
// 然后每个组就是你要的一条新的记录
// 分数为组内所有项的分数最大
return {
'名字': group.key,
'分数': Math.max(...group.items.map(item => item['分数']))
}
});
// 按名字分组然后统计总分
groupBy(arr, item => item['名字'])
.map(group =>({
'名字': group.key,
'总分': group.items.reduce((sum, item) => sum + item['分数'], 0)
}))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…