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

JavaScript数组sort比较函数返回-1、1的执行逻辑解析

JavaScript Array.sort()比较函数-1/1返回值逻辑详解

比较函数的基础判定规则

JS原生数组的sort()方法执行时,会两两取出数组元素传入你定义的比较函数,严格根据函数返回值决定两个元素的先后位置,判定规则固定:

  • 返回值小于0:第一个入参a排在第二个入参b前面
  • 返回值等于0:a和b优先级相同,保留二者原有相对位置(ES2019后稳定排序保证该行为)
  • 返回值大于0:第二个入参b排在第一个入参a前面

示例代码逻辑拆解

你提供的代码是典型的二元分组排序场景,修正转义问题后的完整可运行代码如下:

const rows = [
  createECG('ad0917d4-e02d-4c46-a5aa-dd83717684e9', '28/06/2022', 'pending'),
  createECG('9034124a-2ac8-4d52-8711-ef1351a5c18a', '18/05/2022', 'complete'),
  createECG('a2a7a1f4-81a0-4b70-b1e2-ee7a384a1f4f', '01/05/2022', 'pending'),
  createECG('e5427e62-5897-4eee-a6a6-8f9925feef96', '21/04/2022', 'complete')
].sort((a) => (a.status === 'pending' ? -1 : 1)); 

console.log(rows);

function createECG(id, date, status) {
  return {id, date, status};
}

这段代码里的比较函数省略了第二个入参b,逻辑非常直接:

  • 只要当前比较的元素a的status是pending,就返回-1:相当于告诉排序算法,pending状态的元素优先级永远更高,要往前放
  • 只要当前比较的元素a的status不是pending(示例中均为complete),就返回1:相当于告诉排序算法,非pending状态的元素优先级更低,要往后放

运行效果说明

执行排序后,数组会被分成两段:

  • 前半段是所有pending状态的元素,同状态元素之间的相对顺序不固定,由JS引擎内部的排序遍历逻辑决定
  • 后半段是所有complete状态的元素,同状态元素之间的相对顺序同样不固定

补充提示:这个简化写法仅适合不需要关心同组顺序的粗粒度分组场景。如果需要同状态下按日期、ID等字段进一步排序,必须补全比较函数的两个入参(a, b),补充同优先级下的比较逻辑。


内容的提问来源于stack exchange,提问作者johnDoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 16:18:20