iT邦幫忙

0

請問JS 的Array.prototype.sort()的問題

各位大大好,小弟研究這個範例很久,但還是無解,想請各位大大解說一下最後那段程式碼的流程。

// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

編譯結果
(4) [{…}, {…}, {…}, {…}]
0: {index: 0, value: "delta"}
1: {index: 1, value: "alpha"}
2: {index: 2, value: "charlie"}
3: {index: 3, value: "bravo"}
length: 4
proto: Array(0)

// 按照多个值排序数组
mapped.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});

編譯結果>>>>>(4) [{…}, {…}, {…}, {…}]
0: {index: 1, value: "alpha"}
1: {index: 3, value: "bravo"}
2: {index: 2, value: "charlie"}
3: {index: 0, value: "delta"}
length: 4
proto: Array(0)

如果compareFunction(a, b) 小於 0 ,那麼 a 會被排列到 b 之前;
**return +(a.value > b.value) || +(a.value === b.value) - 1; **
有大大可以解說這段程式碼的意思嗎~我研究好久~還是看不懂。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
timtnlee
iT邦新手 5 級 ‧ 2018-11-22 16:39:01
最佳解答

這邊的 + 是 Unary plus,把後面的值轉成數值

+true //1
+false //0

因此這條

return +(a.value > b.value) || +(a.value === b.value) - 1

可能的樣子:

(1 or 0) || (0 or -1)

順序是:

  1. 如果(a.value > b.value), return 1b 排到 a 前面,不是的話 =>
  2. 回傳0,開始檢查||右邊的式子=>
  3. 如果(a.value === b.value), return 1-1 也就是 0a,b順序不變, 不是的話
  4. return0-1也就是-1,a排序在b前面
aaron0108 iT邦新手 5 級 ‧ 2018-11-22 17:01:02 檢舉

感謝大大的教學,花了幾個小時搞不懂的觀念,一下就通了,真的非常感激~

timtnlee iT邦新手 5 級 ‧ 2018-11-22 17:15:42 檢舉

/images/emoticon/emoticon07.gif

我要發表回答

立即登入回答