JS中sort多条件排序逻辑解惑:为何能执行到二次筛选?
关于JavaScript数组sort二次排序的原理解释
你误解了sort函数的运行逻辑——它不会因为一次return就终止整个排序流程。实际上,sort会反复调用你传入的比较函数,对数组中不同的元素对(a,b)进行两两对比,直到整个数组的元素顺序符合你定义的规则为止。
你的这段代码逻辑是典型的「主字段优先,次字段补全」的排序规则:
- 首先对比主排序字段
a[col]和b[col]:- 如果
a[col] > b[col],返回1,告诉sort:a应该排在b的后面; - 如果
a[col] < b[col],返回-1,告诉sort:a应该排在b的前面; - 只有当主字段值相等时,前两个判断都不会触发
return,代码才会走到后面的二次排序逻辑,对比secondaryFilter字段,用同样的规则决定a和b的相对顺序。
- 如果
举个实际例子,假设你的数组是:
this.report = [ { col: 2, secondaryFilter: 'b' }, { col: 1, secondaryFilter: 'a' }, { col: 2, secondaryFilter: 'a' } ];
sort执行时会多次调用你的比较函数:
- 对比第一个和第二个元素:col值2>1,返回1,两者顺序调换;
- 对比调换后的第一个元素(col=1)和第三个元素:col值1<2,返回-1,顺序不变;
- 对比第二个元素(原第一个,col=2)和第三个元素:col值相等,进入二次对比,'b' > 'a',返回1,所以第三个元素排在第二个前面;
最终排序后的数组为:
[ { col: 1, secondaryFilter: 'a' }, { col: 2, secondaryFilter: 'a' }, { col: 2, secondaryFilter: 'b' } ]
简单来说,比较函数的每一次调用只负责判断一对元素的先后顺序,sort内部会通过多次这样的对比,完成整个数组的排序。只有当主字段无法区分元素顺序时,才会触发二次排序的逻辑。
内容的提问来源于stack exchange,提问作者Toorubelle
相关产品推荐
相关产品推荐

