fruits输出结果:
数字排序 (字母和降序):
JavaScript Array 对象
路人乙
305***8979@qq.com
这个 sort() 方法,如果看上面的例子会非常痛苦。
sort() 方法,有一个可选参数,必须是函数,供它调用。那么就是个回调函数咯!
回调函数的参数要有两个:第一个参数的元素肯定在第二个参数的元素前面!!!
这个方法的排序是看回调函数的返回值:
var arr = [9,7,2]; arr.sort(function(a,b){ if(a>b) // 如果 a 大于 b,位置互换 return 1; else //否则,位置不变 return -1; // 排序结果: 2,7,9
panlf
364***434@qq.com
降序排列:
var list=[1,2,3,4]; list.sort((x,y)=>y-x);
huangyifan
546***203@qq.com
这里纠正一下第一个网友的笔记:
var arr = [9,7,2]; arr.sort(function(a,b){ if(a>b) // 如果 a 大于 b,位置互换 return 1; else //否则,位置不变 return -1; 首先,第一个参数并不是在第二个参数前面,恰恰相反,参数 b 始终在参数 a 的前面。 即第一比较 a>b 其实比较的是 7>9。 第一次比较:7>9,结果为 false,即 return -1,此时 a 会换到 b 前面,即 7 在 9 之前,所以位置互换,并不是这位网友说的 a>b 位置互换,而是 a<b 位置互换。 但是最后输出的结果一样,是因为 a、b 循序理解反了,然后关于 return 结果导致位置交换的概念也弄反了,反反得正,结果就一样了。huangyifan huangyifan 546***203@qq.com4年前 (2019-11-19)
即第一比较 a>b 其实比较的是 7>9。
第一次比较:7>9,结果为 false,即 return -1,此时 a 会换到 b 前面,即 7 在 9 之前,所以位置互换,并不是这位网友说的 a>b 位置互换,而是 a<b 位置互换。
但是最后输出的结果一样,是因为 a、b 循序理解反了,然后关于 return 结果导致位置交换的概念也弄反了,反反得正,结果就一样了。
杨shuai
175***8771@qq.com
去重升序:
var arr = [23,43,54,656,45,53,43,23,4,5,6,4,5] var s = new Set(arr) s = [...s] // console.log(s) s.sort((a,b)=>(a-b)) console.log(s) // [ 4, 5, 6, 23, 43, 45, 53, 54, 656 ]
九亿少女脚臭
pp7***74714@gmail.com
1.升序(从小到大)
arr.sort(function(a,b){//升序排序 if(a<b){return -1;}//小于0 不换位置,因为现在a在b的前面 a<b,这是我们想要的,所以不换位置 else if(a>b){return 1;}//大于0 换位置,因为升序嘛,肯定是要让小的在前面,而现在a>b,所以要换成b a else{return 0;}//a和b相等,不换位置
这里就是我们自己可以用一个比较函数(回调函数)来设置排序规则,用返回值来告诉这个方法,在进行两个数字比较的时候,交不交换位置:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.那么降序(从大到小),也就简单了:
另外提一句:a,b相等,不换位置,这里换不换都无所谓,毕竟相等。不过不同的浏览器可能有的交换位置,有的不交换,不过这个我们不需要关心。
有个问题产生
其实不同的浏览器对这个sort排序方法的实现是不一样的,火狐用的是归并排序,谷歌用的是改进版快速排序。
提这句话,是因为开始遇到一个问题:
arr = [5,4]; arr.sort(function(a,b){//括号里是回调函数 console.log("a=" +a); console.log("b=" +b); console.log(arr);
上面代码把数组的元素取出来,作为实参传递给function这个函数的形参a,b输出时,在不同的浏览器,a和b的值是不一样的:
在火狐会输出:a = 5; b = 4;
在谷歌/ie/edge:a = 4; b = 5;
产生错误的过程:
我是在谷歌浏览器进行调试的,所以开始跟sort方法的结论一样,我以为 a = 数组前一个值,b=数组后一个值,那么就是a = 5,b = 4.
然而在谷歌浏览器输出却是a = 4,b = 5,然后我刚好又看到我楼上那位兄弟说的,应该是b应该都是在a的前面,也就是arr = [第一个,第二个],这样它取元素不就是b=第一个,a=第二个。
再然后我就一想,这函数中那个返回值的规则不是也要换了么:
可是 原本一个本意实现升序的,结果在浏览器中执行结果是降序的。 (当然火狐也是一样降序的)
困扰了我很久,然后我输出a,b的值,去试了好几个浏览器,终于在火狐浏览器发现端倪:
我逐渐意识到也许我们在进行这个sort排序方法时,我们自身不需要去考虑数组元素赋值时,到底把第一个元素赋值给a,还是b。
搜了很多人的博客,发现几年前的谷歌调试代码,上面ab输出也是a = 5; b = 4;
只不过它后续更新升级,然后就改变成现在这样了a=4 b=5
但是无论火狐还是谷歌,他们最终实现的排序效果都是一样的,都是升序或都是降序
故此,得出一个结论,我们不需要去关注a,b(到底前面的传递给a,还是后面的传递给a)
我们需要记住的就是:
a在前,b在后,然后a<b时,不换位置,return -1;(我们需要升序的时候)
a>b时,换位置,return 1;(我们需要升序的时候)
a=b时,不换位置,return 0;
需要降序的时候,return 1 和 return -1换个位置就行了
最终进阶:直接就升序:return a-b;
(升序,如果a<b,返回值 小于0, 是我们想要的,不换位置;如果a>b,大于0,不是我们想要的,所以换位置)
同理,降序:return b-a;
闻丝卡达
114***4761@qq.com
在默认情况下, sort() 方法按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。为了实现排序, sort() 方法会调用每个数组项的 toString() 转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort() 方法比较的也是字符串,如下所示:
var values = [0, 1, 5, 10, 15]; values.sort(); alert(values); //0,1,10,15,5
可见,即使例子中值的顺序没有问题,但 sort() 方法也会根据测试字符串的结果改变原来的顺序。因为数值 5 虽然小于 10,但在进行字符串比较时, "10" 则位于 "5" 的前面,于是数组的顺序就被修改了。不用说,这种排序方式在很多情况下都不是最佳方案。因此 sort() 方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。
function compare(value1, value2) { if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; 这个比较函数可以适用于大多数数据类型,只要将其作为参数传递给 sort() 方法即可,如下面这个例子所示。 var values = [0, 1, 5, 10, 15]; values.sort(compare); alert(values); //0,1,5,10,15 在将比较函数传递到 sort() 方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可。 function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; var values = [0, 1, 5, 10, 15]; values.sort(compare); alert(values); // 15,10,5,1,0闻丝卡达 闻丝卡达 114***4761@qq.com2年前 (2021-05-27)
这个比较函数可以适用于大多数数据类型,只要将其作为参数传递给 sort() 方法即可,如下面这个例子所示。
var values = [0, 1, 5, 10, 15]; values.sort(compare); alert(values); //0,1,5,10,15
在将比较函数传递到 sort() 方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可。
function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; var values = [0, 1, 5, 10, 15]; values.sort(compare); alert(values); // 15,10,5,1,0