這是為了比較特定資料結構而製造的工具函數。例如資料結構格式為:
let arr = [{ name: 'foo', value: 123 }, { name: 'bar', value: 456 }]
這時,一般的 sort 方法需要這麼寫,形如:
sort
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
這段程式碼存在的問題:
硬編碼了 value 參數,排序其它欄位時必須重新編碼。
value
回傳 1 / -1 的邏輯是冗餘而無聊的。
直接寫出排序的匿名函數,在紅寶書的年代可讀性不夠好(現在有箭頭函數,其實問題不大)。
所以對上面的 case,紅寶書作者設計了一個通用的工具函數,以產生一個【用於排序特定字段】的函數。注意你呼叫這個工具函數,回傳的是一個新函數,而不是排序的結果(所謂高階函數)。
應用這個封裝後,程式碼形如:
// 创造一个【根据 value 字段来排序】的函数 let compareFn = createComparisonFunction('value') // 将创造的函数传入 sort 中作为排序依据 arr.sort(compareFn)
這就起到了簡化業務邏輯的作用。
什麼不懂, 就是比較兩個物件某個屬性的大小createComparisonFunction("test")({'test': 1}, {"test": 2})回傳的是-1
createComparisonFunction("test")({'test': 1}, {"test": 2})
呼叫函數時,分成兩步驟來看。首先透過createComparisonFunction()傳入比較的欄位。在createComparisonFunction()函數內,傳回一個匿名函數。同時由於匿名函數處在createComparisonFunction()內,所以你對createComparisonFunction()傳入的參數propertyName對匿名函數也有效存在。 透過上一步,你已經得到的匿名函數包含propertyName,此時你就可以傳入你要比較的兩個對象,在函數內比較他們的propertyName屬性,傳回比較結果。
createComparisonFunction()
propertyName
這個就叫高階函數。
這是為了比較特定資料結構而製造的工具函數。例如資料結構格式為:
這時,一般的
sort
方法需要這麼寫,形如:這段程式碼存在的問題:
硬編碼了
value
參數,排序其它欄位時必須重新編碼。回傳 1 / -1 的邏輯是冗餘而無聊的。
直接寫出排序的匿名函數,在紅寶書的年代可讀性不夠好(現在有箭頭函數,其實問題不大)。
所以對上面的 case,紅寶書作者設計了一個通用的工具函數,以產生一個【用於排序特定字段】的函數。注意你呼叫這個工具函數,回傳的是一個新函數,而不是排序的結果(所謂高階函數)。
應用這個封裝後,程式碼形如:
這就起到了簡化業務邏輯的作用。
什麼不懂, 就是比較兩個物件某個屬性的大小
createComparisonFunction("test")({'test': 1}, {"test": 2})
回傳的是-1
呼叫函數時,分成兩步驟來看。首先透過
createComparisonFunction()
傳入比較的欄位。在createComparisonFunction()
函數內,傳回一個匿名函數。同時由於匿名函數處在createComparisonFunction()
內,所以你對createComparisonFunction()
傳入的參數propertyName
對匿名函數也有效存在。透過上一步,你已經得到的匿名函數包含
propertyName
,此時你就可以傳入你要比較的兩個對象,在函數內比較他們的propertyName
屬性,傳回比較結果。這個就叫高階函數。