JavaScript如何实现数组按姓名分组、组内按分数降序排序
实现方案
你可以通过两种常用方式实现需求,两种方案均兼容所有现代浏览器:
方案1:自定义排序规则直接排序
该方法通过一次排序完成需求,代码更简洁:
var myArray = [ {name: "Alf", "score": "50"}, {name: "John", "score": "55"}, {name: "Alf", "score": "2"}, {name: "Louise", "score": "10"}, {name: "Louise", "score": "33"}, {name: "Alf", "score": "22"} ]; // 先记录每个姓名首次出现的顺序,确定分组的先后 const nameFirstIndex = new Map(); myArray.forEach((item, idx) => { if (!nameFirstIndex.has(item.name)) { nameFirstIndex.set(item.name, idx); } }); // 自定义排序 const sortedArray = myArray.sort((a, b) => { // 不同姓名的按首次出现顺序排列,保证分组顺序 const orderA = nameFirstIndex.get(a.name); const orderB = nameFirstIndex.get(b.name); if (orderA !== orderB) { return orderA - orderB; } // 同姓名的按分数降序排列,注意score是字符串需要转数字 return Number(b.score) - Number(a.score); }); console.log(sortedArray);
方案2:先分组再排序拼接
该方法逻辑更清晰,适合需要单独处理每组数据的场景:
var myArray = [ {name: "Alf", "score": "50"}, {name: "John", "score": "55"}, {name: "Alf", "score": "2"}, {name: "Louise", "score": "10"}, {name: "Louise", "score": "33"}, {name: "Alf", "score": "22"} ]; // 按姓名分组 const groupMap = {}; myArray.forEach(item => { if (!groupMap[item.name]) groupMap[item.name] = []; groupMap[item.name].push(item); }); // 获取原数组中姓名首次出现的顺序列表 const nameOrder = [...new Set(myArray.map(item => item.name))]; // 每组内部降序排序后拼接成最终数组 const sortedArray = nameOrder.flatMap(name => { return groupMap[name].sort((a, b) => Number(b.score) - Number(a.score)); }); console.log(sortedArray);
注意事项
- 示例中
score为字符串类型,排序时必须转换为数字比较,否则会出现字符串排序的逻辑错误(如"10" < "2") - 如果需要保留原数组不被修改,可以在排序前先对数组做浅拷贝:
[...myArray].sort(...)
内容的提问来源于stack exchange,提问作者Omar Bouattour
相关产品推荐
相关产品推荐

