如何根据年龄和分数对对象数组进行多条件排序?
嗨,我来帮你搞定这个多字段排序的问题!其实核心思路很简单:先按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
相关产品推荐
相关产品推荐

