如何使用.sort()实现对象数组多字段排序:指定值优先+多级排序
解决方案
先给你能实现全部规则的完整代码:
let obj = [ {'name': 'Seller','number': 2}, {'name': 'alvino','number': 9}, {'name': 'nick','number': 6}, {'name': 'lee','number': 2}, {'name': 'Seller','number': 1}, {'name': 'Kevin','number': 4}, {'name': 'Brady','number': 2}, {'name': 'Seller','number': 3}, {'name': 'Alvino','number': 3}, ]; let sorted = obj.sort((a, b) => { // 两个都是Seller的情况:按number升序排列 if (a.name === 'Seller' && b.name === 'Seller') { return a.number - b.number; } // 单个是Seller的情况:让Seller排在前面 if (a.name === 'Seller') return -1; if (b.name === 'Seller') return 1; // 非Seller的情况:先按name不区分大小写升序,再按number降序 const nameCompare = a.name.toLowerCase().localeCompare(b.name.toLowerCase()); if (nameCompare !== 0) { return nameCompare; } // name相同时,按number降序排列 return b.number - a.number; }); console.log(sorted);
代码逻辑拆解
- Seller优先级处理:先判断两个对象是否均为Seller,是的话用
a.number - b.number实现升序;若仅一个是Seller,直接通过返回-1或1让Seller排在前列。 - 非Seller排序:
- 将name统一转成小写后用
localeCompare比较,实现不区分大小写的升序排序,该方法返回的正负值刚好适配sort函数的规则。 - 若name(不区分大小写)相同,用
b.number - a.number实现number的降序排列(sort函数返回正数时,b会排在a前面)。
- 将name统一转成小写后用
你现有代码的问题
- 笔误:把属性
number写成了helpful,导致排序逻辑失效; - 判断错误:第三个
if (a.name === 'Seller') return 1;完全多余,应改为判断b.name === 'Seller'来处理b是Seller的场景; - 逻辑缺失:没有实现非Seller对象的name不区分大小写排序和number降序规则。
内容的提问来源于stack exchange,提问作者Alvino
相关产品推荐
相关产品推荐

