You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:54:06