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
相关产品推荐
相关产品推荐

