JavaScript中如何按自定义规则对指定结构的n维数组排序?
实现符合规则的n维数组排序
这问题挺有意思的,咱们可以通过写一个递归的通用比较函数来完美解决,完全匹配你提出的所有排序规则。
先明确核心排序规则
先把你说的规则再梳理得更清晰,方便我们对应实现:
- 数字优先级高于数组:如果比较的两个元素一个是数字、一个是数组,数字必须排在数组前面
- 同类型元素逐层比较:
- 两个数字直接比大小(升序)
- 两个数组先比较它们的第一个元素(递归深入比较),如果相等再比较第二个元素
- 要是当前层级的元素都相等,就自动回溯到父级比较右侧兄弟元素(递归本身就会处理这个逻辑)
实现通用比较函数
因为数组是n维的,递归是最适合的方式——它会自动深入到每一层,不需要我们提前知道具体的维度数。代码如下:
function compare(a, b) { // 区分元素类型:数字 vs 数组 const isANumber = typeof a === 'number'; const isBNumber = typeof b === 'number'; // 数字优先级高于数组的情况 if (isANumber && !isBNumber) { return -1; // 数字在前,所以a比b小 } if (!isANumber && isBNumber) { return 1; // b是数字,排前面,所以a比b大 } // 都是数字的情况,直接比较数值 if (isANumber && isBNumber) { return a - b; } // 都是数组的情况(内层数组都是2个元素,符合你的结构要求) // 先比较第一个元素,递归调用compare深入层级 const firstLevelCompare = compare(a[0], b[0]); if (firstLevelCompare !== 0) { return firstLevelCompare; } // 第一个元素相等,再比较第二个元素 return compare(a[1], b[1]); }
使用方式
不管是2维、3维还是任意n维数组,只要符合你的结构要求(除最外层数组,其余都是仅含2个元素的数组/数字),直接用数组的sort方法传入这个比较函数就行:
// 二维数组示例 const twoDArr = [[1,2],[2,4],[1,1],[2,5],[0,9]]; twoDArr.sort(compare); // 结果:[[0,9],[1,1],[1,2],[2,4],[2,5]](这里纠正下你之前示例的小笔误,按升序规则[1,1]应该在[1,2]前) // 三维数组示例(你的未排序数组) const threeDArr = [[[21,5],[16,18]],[[12,45],[15,23]],[[12,45],[15,22]]]; threeDArr.sort(compare); // 结果:[[[12,45],[15,22]],[[12,45],[15,23]],[[21,5],[16,18]]],完全符合你的预期
补充说明
- 如果需要降序排序,只需要把比较函数的返回值取反,或者在sort时传入
(a,b) => compare(b,a) - 这个函数不需要提前知道n的值,递归会自动处理所有层级的比较,完全适配任意符合结构的n维数组
内容的提问来源于stack exchange,提问作者Chief VOLDEMORT
相关产品推荐
相关产品推荐

