javascript - 關於比較函數的問題
为情所困
为情所困 2017-07-05 11:06:44
0
4
873
雷雷
为情所困
为情所困

全部回覆(4)
过去多啦不再A梦

這是為了比較特定資料結構而製造的工具函數。例如資料結構格式為:

let arr = [{ name: 'foo', value: 123 }, { name: 'bar', value: 456 }]

這時,一般的 sort 方法需要這麼寫,形如:

arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })

這段程式碼存在的問題:

  1. 硬編碼了 value 參數,排序其它欄位時必須重新編碼。

  2. 回傳 1 / -1 的邏輯是冗餘而無聊的。

  3. 直接寫出排序的匿名函數,在紅寶書的年代可讀性不夠好(現在有箭頭函數,其實問題不大)。

所以對上面的 case,紅寶書作者設計了一個通用的工具函數,以產生一個【用於排序特定字段】的函數。注意你呼叫這個工具函數,回傳的是一個新函數,而不是排序的結果(所謂高階函數)。

應用這個封裝後,程式碼形如:

// 创造一个【根据 value 字段来排序】的函数
let compareFn = createComparisonFunction('value')
// 将创造的函数传入 sort 中作为排序依据
arr.sort(compareFn)

這就起到了簡化業務邏輯的作用。

淡淡烟草味

什麼不懂, 就是比較兩個物件某個屬性的大小
createComparisonFunction("test")({'test': 1}, {"test": 2})
回傳的是-1

巴扎黑

呼叫函數時,分成兩步驟來看。首先透過createComparisonFunction()傳入比較的欄位。在createComparisonFunction()函數內,傳回一個匿名函數。同時由於匿名函數處在createComparisonFunction()內,所以你對createComparisonFunction()傳入的參數propertyName對匿名函數也有效存在。
透過上一步,你已經得到的匿名函數包含propertyName,此時你就可以傳入你要比較的兩個對象,在函數內比較他們的propertyName屬性,傳回比較結果。

我想大声告诉你

這個就叫高階函數。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板