[英]JavaScript callback function inside sort() a and b variables
我試圖理解sort()
函數如何與傳遞給它的回調函數一起工作。 更具體地說, a
和b
的值
示例代碼:
var n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log('--')
return a-b;
});
結果:
4
11
--
11
2
--
4
2
--
11
10
--
4
10
--
11
3
--
10
3
--
4
3
--
2
3
--
11
1
--
10
1
--
4
1
--
3
1
--
2
1
--
第一輪我可以遵循a
= 4, b
= 11,易於遵循。
第二輪我可以遵循a
= 11和b
= 2。
但在那之后我對實際發生的事情進行了一些松散的跟蹤,例如當你到達a
= 4和b
= 3時。這實際上是如何工作的? 我嘗試在紙上完成它,但無法看到a
和b
輸出中的邏輯。
你可以這樣看。 如果有兩個數字,請比較a(前一個)和b(下一個)。
如果a大於b,則將其放在b之后。
如果a小於b,則將其放在b之前。
事實上,當你有一個'a> b'的情況下,你可以返回任何正數:放一個后b。
並且,當你有一個'a <b'的情況下,你可以返回任何負數:在b之前放一個。 它實際上是一次比較2個數字。
陣列中的位置可以理解如下。 從return ab
的角度來看,如果你返回一個負數,則先放一個b; 如果你返回一個正數,請輸入一個后b。 負數 - 零 - 正數。
也許,您可以通過在運行時打印出n中的內容來更好地理解它。
window.n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log(window.n); // You can see what is in n in the every comparison
console.log('--')
return a-b;
});
Chrome v64.0.3282上的結果
4
11
(6) [4, 11, 2, 10, 3, 1]
--
11
2
(6) [4, 11, 2, 10, 3, 1]
--
4
2
(6) [4, 11, 11, 10, 3, 1]
--
11
10
(6) [2, 4, 11, 10, 3, 1]
--
4
10
(6) [2, 4, 11, 11, 3, 1]
--
11
3
(6) [2, 4, 10, 11, 3, 1]
--
10
3
(6) [2, 4, 10, 11, 11, 1]
--
4
3
(6) [2, 4, 10, 10, 11, 1]
--
2
3
(6) [2, 4, 4, 10, 11, 1]
--
11
1
(6) [2, 3, 4, 10, 11, 1]
--
10
1
(6) [2, 3, 4, 10, 11, 11]
--
4
1
(6) [2, 3, 4, 10, 10, 11]
--
3
1
(6) [2, 3, 4, 4, 10, 11]
--
2
1
(6) [2, 3, 3, 4, 10, 11]
--
(6) [1, 2, 3, 4, 10, 11] // result
您的代碼返回與以下相同的結果:
var n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log('--')
if (a > b) {
return 1;
} else {
return -1;
}
});
(6) [1, 2, 3, 4, 10, 11] // result
要么
var n = [4, 11, 2, 10, 3, 1];
n.sort((a, b) => a > b ? 1 : -1);
(6) [1, 2, 3, 4, 10, 11] // result
看起來像修改后的冒泡排序。 當你比較每一步的數組狀態時,你可以看到發生了什么 - 我在下面添加了它們。
將索引1中的值盡可能低地移動。 (索引0-1按順序)現在將索引2中的值移動到應該的最低值。 (索引0-2按順序)現在將索引3中的值移動到應該去的最低位置。 (索引0-3是有序的)
由於我們知道有多少數組是為了使比較短路並且在比較函數不是負數時立即跳轉到下一個索引。
4
11
-- [4, 11, 2, 10, 3, 1];
11
2
-- [4, 2, 11, 10, 3, 1];
4
2
-- [2, 4, 11, 10, 3, 1];
11
10
-- [2, 4, 10, 11, 3, 1];
4
10
-- [2, 4, 10, 11, 3, 1];
11
3
-- [2, 4, 10, 3, 11, 1];
10
3
-- [2, 4, 3, 10, 11, 1];
4
3
-- [2, 3, 4, 10, 11, 1];
2
3
-- [2, 3, 4, 10, 11, 1];
11
1
-- [2, 3, 4, 10, 1, 11];
10
1
-- [2, 3, 4, 1, 10, 11];
4
1
-- [2, 3, 1, 4, 10, 11];
3
1
-- [2, 1, 3, 4, 10, 11];
2
1
-- [1, 2, 3, 4, 10, 11];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.