You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:29:09