如何按两个条件对对象数组进行排序?
对象数组的多条件排序解决方案
你需要给对象数组实现以下排序规则:
- 整体按
value字段排序 - 拥有相同
name的对象必须相邻,且同组内按value顺序排列
实现步骤
1. 预处理分组基准值
先为每个 name 计算一个基准值(示例用组内最小的 value),以此保证相同 name 的对象作为一个整体参与排序:
const arr = [ { name: "X", value: 5 }, { name: "A", value: 3 }, { name: "A", value: 1 }, { name: "B", value: 2 }, ]; // 记录每个name对应的最小value,作为组排序的基准 const nameGroupKey = {}; arr.forEach(item => { if (!nameGroupKey[item.name] || item.value < nameGroupKey[item.name]) { nameGroupKey[item.name] = item.value; } });
2. 自定义排序函数
利用 Array.sort() 结合预处理的基准值,完成多条件排序:
arr.sort((a, b) => { // 优先按组的基准值排序,确保同name的组整体顺序正确 const groupDiff = nameGroupKey[a.name] - nameGroupKey[b.name]; if (groupDiff !== 0) { return groupDiff; } // 同name的对象,按value字段排序 if (a.name === b.name) { return a.value - b.value; } // 基准值相同但name不同时,按name排序保证结果稳定性 return a.name.localeCompare(b.name); });
最终排序结果
执行后数组会变为:
[ { name: "A", value: 1 }, { name: "A", value: 3 }, { name: "B", value: 2 }, { name: "X", value: 5 } ]
灵活调整说明
- 若需要降序排序,只需将排序函数中的减法结果取反(比如
return groupDiff * -1) - 若想以组内最大
value作为基准,把预处理中的<替换为>即可
内容的提问来源于stack exchange,提问作者Jey R
相关产品推荐
相关产品推荐

