我正在查看this排序教程,我在理解它时遇到了问题。
我发现在将一个sortfunction传递给.sort()
时,规则如下。
- 小于0:排序" a"比" b"
更低的指数- 零:" a"和" b"应该被认为是平等的,并且没有进行分类。
- 大于0:排序" b"比" a"。
更低的索引
我正在测试这个代码段:
var myarray=[25, 8, 7, 41];
console.log(myarray);
console.log(myarray.sort(function(a,b) {
console.log("a : " , a , " b : " , b, " oper : " , b-a, " arr ");
return b -a
}));
主要部分是return b -a
,这应该按照我认为的降序返回数组,因为如果b
大于a
,它将被置于较低的索引中。我认为我很难确定"更低"手段。这是否意味着它直接在a
或b
之前进入数组的开头?
这里是我感到困惑的地方。代码的结果是:
[25, 8, 7, 41]
a : 25 b : 8 oper : -17 arr
a : 8 b : 7 oper : -1 arr
a : 7 b : 41 oper : 34 arr
a : 25 b : 41 oper : 16 arr
[41, 25, 8, 7]
这只是我的想法
因为前2个比较产生负a
在b
之前,所以在前2个比较结束时,数组应该是[25,8,7,41]
(没有变化)。
然后下一个比较是一个正数(34),所以我认为b
在a
之前,所以它现在是[25,8,41,7]
然后我不知道为什么它比较25和41 next如何a
= 25和b
= 41?你能告诉我如何查看数组,因为它正在被转换我尝试这样做没有成功。提前谢谢。
如果您看到另一个问题,详细解释了这种排序细分,我将很乐意结束这个问题。我不是故意在SO上提出无用的问题。大多数tuts只解释如何排序一般但不分解。谢谢
答案 0 :(得分:1)
那么有没有办法显示排序过程?就像你做的那样 循环你可以console.log活动你的循环。你能 console.log对数组进行排序所需的步骤?我猜不是。
使用Math.min()
,Math.max()
的方法; Array.prototype.splice()
// `arr` : input array
function _sort(arr) {
// declare `min` variable
// `res` : array that will be returned
var min = null, res = []; console.log("step 1", min, res);
// while `arr` contains elements
while (arr.length) {
// set `min` to smallest number in `arr`
min = Math.min.apply(Math, arr); console.log("step 2", min);
// push `min` to `res` array
res.push(min); console.log(res);
// remove `min` element from `arr` array
arr.splice(arr.indexOf(min), 1); console.log("step 3", arr);
}
// return `res` array
return res
}
console.log("step 4", _sort([27, 1, 3, 14]))