JavaScript排序函数是如何工作的(作为一种算法)
How does the JavaScript sort function work(as an algorithm)?
采用参数的JavaScript排序函数允许传入函数。
例如:
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]
代码是怎么回事
function(a,b){
return a - b
}
被解释为提升?它应该分为三种情况,< 0
、== 0
和> 0
,但当a
和b
可以是任何东西时,这又有什么意义呢?
谢谢!
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41]
只需将其更改为
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]
在控制台日志中尝试上述代码后,您将看到以下结果
var myarray=[25, 8, 7, 41]
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]
被解释为提升?它应该分为三种情况,<0、==0和>0;但是,当a和b可以是任何东西时,这又有什么意义呢?
首次比较:25.8
现在,让我们来回答您对它如何选择a,b的值的疑问。当您运行代码时,您会看到第一次比较是在25,8之间进行的,如果结果为正,则意味着8较小。所以它只是简单地将其重新排序为8/25。
第二次比较:25.7
下一个比较是在25、7之间进行的,这是因为如果结果是负数,那么第三个数字将放在25之后,并对这三个数字进行排序。
但情况不同了,现在的结果又是积极的。该阵列仍向重新订购
8, 7, 25
之后,它再次执行测试,直到它发现条件是肯定的。所以现在它比较8,7,结果又是否定的。
阵列再次向重新排序
7, 8, 25
第三次比较:25,41
现在,在最后一次比较中,结果为正,这意味着41大于25。
因此,阵列将自身重新排序为
7,8,25,41
回答问题之所以特别棘手,或者至少在细节上是因为没有规范说明浏览器应该实现哪种排序算法。因此,告诉你它在一个浏览器上的具体工作方式可能会因浏览器而异,甚至会随着时间的推移而变化。
不过,要点是,你想把"a"answers"b"看作任何两个值。如果您返回的是"a"-"b"的结果,那么您的排序将按升序进行。如果你做"b"-"a",那么它是按降序排列的。
制作自己的排序函数的好处是,在单独的函数中处理"a"answers"b"后,可以比较它们的值。假设你想按摄氏度值排序,但你的数组只以华氏度为单位。你可以做一些类似的事情:
.sort(function(a,b){ return to_fahrenheit(a) - to_fahrenheit(b);}
函数sort
会多次调用compareFunction
函数,并将项a
和b
传递给它。这种情况会发生多次,直到数组排序为止。
比较函数应返回:
- 如果CCD_ 10则为0
- 如果CCD_ 11则为正数
- 如果CCD_ 12
现在,让我们来看看代码中的函数,我们有a - b =
:
- 如果CCD_ 14则为0
- 如果CCD_ 15则为正数
- 如果CCD_ 16
因此,它返回预期的结果,数组将被正确排序。
有关更多信息,请查看文档。
函数接受两个参数(a,b)。此函数从b中减去a并返回结果。如果返回值为
正-a是一个大于b的数字
负数-a是一个小于b的数字
ZERO-a等于b
行为因浏览器而异:请参阅不同浏览器生成的输出:
var numArray = [20,1,10,2,3];
numArray.sort(function(a,b) {
document.write("a = " + a + ", b = " + b + "<br />");
return a-b}
);
output on firefox :
a = 20, b = 1
a = 20, b = 10
a = 1, b = 10
a = 2, b = 3
a = 20, b = 2
a = 1, b = 2
a = 10, b = 2
a = 10, b = 3
output on chrome:
a = 20, b = 1
a = 20, b = 10
a = 1, b = 10
a = 20, b = 2
a = 10, b = 2
a = 1, b = 2
a = 20, b = 3
a = 10, b = 3
a = 2, b = 3
希望这能有所帮助!!
因为如果b
大于a
,它将小于0。如果是a == b
,则返回0。否则它将是一个正数。
var a = [5,2,1,3,9,6];
console.log(a.sort(function(a,b){console.log(a+"," +b); return a>b;}));
Result:
5,2 => create array [2,5]
5,1 => need to check 2 and 1. [2,5], [1,5]
2,1 => push 1 before 2? isOk? => OK [1,2,5]
5,3 => need to check 1,2 with 3 before 5 [1,2,5], [3,5]
2,3 => push 3 after 2 and before 5 => OK [1,2,3,5]
5,9 => [1,2,3,5,9]
9,6 => [1,2,3,5,9], [6,9]
5,6 => [1,2,3,5,6,9]
这通过一个例子更容易理解。让我们研究一下每种可能的情况:
- 设a=10,b=20。所以
a - b
就是-10
,按照惯例,如果a < b
,我们会返回一个负值,所以我们是好的 - 设a=20,b=10。所以
a - b
就是10
,按照惯例,如果a > b
,我们会返回一个正值,所以我们仍然是好的 - 设a=10,b=10。所以
a - b
就是0
,按照惯例,如果a == b
,我们返回0
,一切都如预期
一般情况下:如果a < b
,则a - b
将始终为负;如果a > b
,则a - b
将始终为正;如果a == b
、a - b
将始终是0
,只要a
和b
是整数值即可。
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- 有没有一种方法可以仅使用HTML/CSS来隐藏基于特定值的数据单元格
- 有没有一种方法可以从URL跟踪请求的域
- 有没有一种方法可以列出Ember.Object的所有绑定
- 有没有一种方法可以获得three.js的最小/lite版本
- 有没有一种方法可以在没有文档或jQuery的情况下使用javascript解码html实体
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 有没有一种方法可以从Javascript检测特定的应用程序是否安装在(AndroidiOS)设备上
- 一种从随机数的序列中查找值的简单算法
- 寻找一种算法来聚类三维点,围绕二维点
- JavaScript排序函数是如何工作的(作为一种算法)
- 多维数组.一种求解算法
- 一种算法,用于判断从列表中识别一个单词需要多少个不同的先导字符
- 是否有一种方法可以使用HTML5大纲算法和CSS(可能还有JS)生成文档导航
- 寻找一种 FP 算法来从点分隔的字符串组成对象