如何对数组执行双层排序:先按列分10级分组,再按指定列排序
没问题,我来帮你拆解这两个双层排序的需求,结合代码例子会更直观👇
1. 通用场景:按指定列10为层级分组后再排序
核心思路:先给目标列计算出10为间隔的层级分组(比如数值除以10取整),然后先按这个分组进行排序,再在每个分组内按第二列排序。
举个JavaScript的示例(其他语言逻辑类似,只是语法不同):
假设我们有一个对象数组,要按colA的10层级分组,再按colB升序排序:
const arr = [ { id: 1, colA: 15, colB: 20 }, { id: 2, colA: 7, colB: 15 }, { id: 3, colA: 23, colB: 25 }, { id: 4, colA: 12, colB: 18 }, { id: 5, colA: 8, colB: 10 } ]; // 排序逻辑 const sortedArr = arr.sort((a, b) => { // 计算10层级的分组标识 const groupA = Math.floor(a.colA / 10); const groupB = Math.floor(b.colA / 10); // 第一步:按分组排序(升序) if (groupA !== groupB) { return groupA - groupB; } // 第二步:同组内按colB升序排序 return a.colB - b.colB; });
排序后的结果会先把colA在0-9、10-19、20-29的元素分成三组,每组内按colB从小到大排列。如果需要降序,只需要把返回值的正负调换即可。
2. 特定需求:edd分组+组内price排序
针对你提到的规则:edd分为1-10、11-20、21-30三个分组,先按edd分组排序,再在每个分组内按price排序,我们可以这样实现:
步骤1:定义分组规则
先写一个辅助函数,用来判断每个元素属于哪个分组:
const getEddGroup = (edd) => { if (edd >= 1 && edd <= 10) return 1; if (edd >= 11 && edd <= 20) return 2; if (edd >= 21 && edd <= 30) return 3; return 0; // 处理超出范围的元素,默认放在最前面 };
步骤2:执行双层排序
假设我们有如下输入数组:
const items = [ { edd: 25, price: 100 }, { edd: 8, price: 50 }, { edd: 15, price: 70 }, { edd: 22, price: 90 }, { edd: 12, price: 60 }, { edd: 5, price: 80 } ];
排序代码:
const sortedItems = items.sort((a, b) => { const groupA = getEddGroup(a.edd); const groupB = getEddGroup(b.edd); // 先按分组升序(1→2→3) if (groupA !== groupB) { return groupA - groupB; } // 同组内按price升序排序(如果要降序就写 b.price - a.price) return a.price - b.price; });
预期结果
排序后的数组如下:
[ { edd: 8, price: 50 }, { edd: 5, price: 80 }, { edd: 12, price: 60 }, { edd: 15, price: 70 }, { edd: 22, price: 90 }, { edd: 25, price: 100 } ]
可以看到:
- 所有edd在1-10的元素排在最前面,组内按price从低到高排列
- 接着是edd11-20的元素,同样按price升序
- 最后是edd21-30的元素,按price升序排列
内容的提问来源于stack exchange,提问作者Yohanes Pradono
相关产品推荐
相关产品推荐

