来个 js 大佬回答一下这个 sort 问题?

mikechen
  • 754

看到 网上 有个大佬 写了这样一个算法

function move(nums) {
  nums.sort((a, b) => b ? 0 : -1)
  return nums
}
var nums = [0, 2, 0, 1, 5]
var res = move(nums)
console.log('res: ', res) //[2, 1, 5, 0, 0]

相当于直接把 0 放到了最后 其他相对顺序不变

平时 只用到了 sort 的排序功能 这种真没见过

看了 https://developer.mozilla.org... 的说明

(而且我发现第一次比较的时候 a 是 2 , b 是 0,是反着比较的吗...)实在没大搞懂

请大佬来回复一下,越详细越好哈哈哈哈

回复
阅读 885
4 个回答

可以这么理解,假如sort的回调是下面的函数

(a,b) => {
    return x
}

那么sort的时候a和b的相对位置是否交换,取决于x的值
x>=0时,a和b的相对位置不交换
x<0时,a和b交换位置

这算是排序方法sort的一种“妙用”吧,过程并不是那么复杂。你只需要理解sort方法返回值1或者0表示不变,-1表示交换,即只有返回-1才表示交换。

(a, b) => b ? 0 : -1
再来理解这里,使用的是第二个数来进行比较(可以决定0是放在前,还是放在后),非0即会产生交换。也即非0在前,所以0会放到最后。

其实,还可以得到一些其他妙用,比如数组前后交换:
(a, b) => -1
再比如,将某个数,比如2,放在结尾:
(a, b) => b - 2 ? 0 : -1
题主那里,就可以理解是将0放到结尾。

只是使用这个方法的时候,要注意数据类型,尤其是默认的时候。

你这各比较函数有问题。

2, 0: --> -1 : 2 < 0

0, 2: --> 0 : 0 == 2

按这个比较函数,出啥结果都有可能啊 ...

丶瑶
  • 368

我不是大佬:

//把数据改的简单一点:
nums = [0,1,2,3,4];

//观察一下:
nums.sort( (a, b) => console.log(a, b, '→', b?0:-1) )

//结果:
1 0 → -1
2 1 → 0
2 0 → -1
2 1 → 0
3 2 → 0
3 0 → -1
4 3 → 0
4 0 → -1

//把结果整理下:
----第0组内循环----
[0,1,2,3,4] → [1,0,2,3,4]
----第1组内循环----
[1,0,2,3,4] → [1,0,2,3,4]
[1,0,2,3,4] → [1,2,0,3,4]
[1,2,0,3,4] → [1,2,0,3,4]
----第2组内循环----
[1,2,0,3,4] → [1,2,0,3,4]
[1,2,0,3,4] → [1,2,3,0,4]
----第3组内循环----
[1,2,3,0,4] → [1,2,3,0,4]
[1,2,3,0,4] → [1,2,3,4,0]

结论:
1、参数 b 是当前遍历的元素,a 是它的前一个元素(你的疑问)
2、每轮遍历,都会拿 b 和它前面的元素进行内循环冒泡排序(返回值控制)
3、第 N 组内循环结束后,数组的前 N 个元素将不再参与内循环(节省性能)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏