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

如何根据年龄和分数对对象数组进行多条件排序?

嗨,我来帮你搞定这个多字段排序的问题!其实核心思路很简单:先按age排序,当两个对象的age相等时,再用score来决定它们的顺序。

先给你一个直接能用的实现,基于你提供的数组示例,我们先实现「按age升序排列,age相同的情况下按score降序排列」的逻辑(你可以根据需求调整升/降序):

var unsorted = [
  { name: 'Peter', age: 0, work:'driving', score : 20 },
  { name: 'John', age: 0, work:'document', score : 30 },
  { name: 'Jess', age: 46, work:'teaching', score :10 },
  { name: 'Alice', age: 0, work:'singing', score:80 }
];

// 复制原数组避免修改原数据,然后执行排序
var sortedByAgeAndScore = unsorted.slice(0).sort(function(a, b) {
  // 第一步:比较age
  if (a.age !== b.age) {
    return a.age - b.age; // 升序(从小到大),要降序就改成 b.age - a.age
  }
  // 第二步:age相等时,比较score
  return b.score - a.score; // 这里是降序(从大到小),要升序就改成 a.score - b.score
});

console.log(sortedByAgeAndScore);
// 输出结果里,age为0的三个对象会按score从80到20排列,然后是age46的Jess

如果你想把现有的sortByKey函数扩展成支持多字段排序的通用工具,也可以这样改造:

// 支持多字段+自定义排序方向的通用排序函数
function sortByMultipleKeys(arr, sortRules) {
  return arr.slice(0).sort(function(a, b) {
    // 依次遍历每个排序规则,优先级从左到右
    for (let rule of sortRules) {
      const { key, order = 'asc' } = rule;
      let compareResult = 0;
      
      // 数值类型用减法比较,字符串用localeCompare(支持多语言排序)
      if (typeof a[key] === 'number' && typeof b[key] === 'number') {
        compareResult = a[key] - b[key];
      } else {
        compareResult = String(a[key]).localeCompare(String(b[key]));
      }

      // 如果当前字段能区分顺序,就返回结果;否则继续比较下一个字段
      if (compareResult !== 0) {
        return order === 'desc' ? -compareResult : compareResult;
      }
    }
    // 所有字段都相等,返回0
    return 0;
  });
}

// 调用示例:先按age升序,再按score降序
var sorted = sortByMultipleKeys(unsorted, [
  { key: 'age', order: 'asc' },
  { key: 'score', order: 'desc' }
]);

console.log(sorted);

简单说下原理:数组的sort方法会根据回调函数的返回值来调整元素顺序——返回负数则a排在b前面,返回正数则b排在a前面,返回0则顺序不变。我们先判断age,只有当age相等时才会进入score的比较,这样就实现了「先age后score」的优先级排序。

内容的提问来源于stack exchange,提问作者Priya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:18:52