var arr = [5, 2, 1, -10, 8];
arr.sort(function(a, b) {
console.log(a,b)
return b - a;
}) ; // 8, 5, 2, 1, -10
此回调如何运作?
选择a和b的原则是什么?
请从内部解释这个特例。
输出console.log(首先请解释此输出):
5 2
2 1
1 -10
-10 8
1 8
2 8
5 8
答案 0 :(得分:9)
这取决于实施。这个实际的实现,看起来像insertion sort,有这么多的数据(可能与Chrome不同,不同的实现少于10个项目或更多项),从索引零到最后如果在最后两个项目中没有发生交换,则它会停止,否则它会向后转移到零指数。
基本上它按此顺序进行测试和更改
5 2 1 -10 8 original order
5 2
2 1
1 -10
-10 8 swap
8 -10
1 8 swap
8 1
2 8 swap
8 2
5 8 swap
8 5 2 1 -10 result
更复杂的排序更好地显示了正在发生的事情,有两个更大的值,需要移动到数组的另一侧
8 9 1 2 3 4 original array
8 9
9 1 swap
1 9
8 1 swap
1 8
9 2 swap
2 9
8 2 swap
2 8
1 2
9 3 swap
3 9
8 3 swap
3 8
2 3
9 4 swap
4 9
8 4 swap
4 8
3 4
1 2 3 4 8 9 result
实例,不适用于所有用户代理(例如,不在Edge中,但在Chrome中)
var array = [8, 9, 1, 2, 3, 4];
console.log(JSON.stringify(array));
array.sort(function (a, b) {
console.log(a , b, JSON.stringify(array));
return a - b;
});
console.log(JSON.stringify(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:3)
.sort()
必须返回数字,表示必须将女孩项放在前面:
< 0 - 第一个元素必须放在第二个元素之前 0 - 两个元素相等,不改变顺序 > 0 - 第一个元素必须放在第一个元素之前。
通常b - a
表示后代排序,而a - b
表示上升排序。
使用什么算法对元素进行排序取决于.sort
的浏览器实现。检查它们的比较:
答案 2 :(得分:0)
它会通过将该值移动到较低或较高的值来对项目进行排序。
以下是一些信息:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
如果提供compareFunction,则对数组元素进行排序 根据比较函数的返回值。如果a和b是 比较两个要素,然后:
- 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
- 如果compareFunction(a,b)返回0,则保持a和b相对于彼此不变,但相对于所有不同的分类 元素。注意:ECMAscript标准不保证这一点 行为,因而并非所有浏览器(例如Mozilla版本约会 回到至少2003年)尊重这一点。
- 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。
- compareFunction(a,b)在给定一对特定元素a和b作为其两个参数时必须始终返回相同的值。如果 返回不一致的结果,然后排序顺序未定义。
因此,比较函数具有以下形式:
function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1;
}
if (a is greater than b by the ordering criterion) {
return 1;
}
// a must be equal to b
return 0;
}
要比较数字而不是字符串,比较功能可以简单 从a中减去b。以下函数将对数组进行排序 升序(如果它不包含无穷大和NaN):
function compareNumbers(a, b) {
return a - b;
}