javascript - 關于比較函數的問題
問題描述
function createComparisonFunction(propertyName) { return function(object1,object2) {var value1 = object1[propertyName];var value2 = object2[propertyName]; if(value1 < value2) { return -1;} else if(value1 > value2) { return 1;} else { return 0;} }};這是紅寶書中一個知識點,這段代碼不是太明白
問題解答
回答1:這是為了比較特定數據結構而制造的工具函數。例如數據結構格式為:
let arr = [{ name: ’foo’, value: 123 }, { name: ’bar’, value: 456 }]
這時,一般的 sort 方法需要這么編寫,形如:
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
這段代碼存在的問題:
硬編碼了 value 參數,排序其它字段時必須重新編碼。
返回 1 / -1 的邏輯是冗余而無聊的。
直接編寫排序的匿名函數,在紅寶書的年代可讀性不夠好(現在有箭頭函數,其實問題不大)。
所以對上面的 case,紅寶書作者設計了一個通用的工具函數,以生成一個【用于排序特定字段】的函數。注意你調用這個工具函數,返回的是一個新函數,而不是排序的結果(所謂高階函數)。
應用這個封裝后,代碼形如:
// 創造一個【根據 value 字段來排序】的函數let compareFn = createComparisonFunction(’value’)// 將創造的函數傳入 sort 中作為排序依據arr.sort(compareFn)
這就起到了簡化業務邏輯的作用。
回答2:什么不明白, 就是比較兩個對象某個屬性的大小createComparisonFunction('test')({’test’: 1}, {'test': 2})返回的是-1
回答3:調用函數時,分為兩步來看。首先通過createComparisonFunction()傳入比較的字段。在createComparisonFunction()函數內,返回一個匿名函數。同時由于匿名函數處在createComparisonFunction()內,所以你對createComparisonFunction()傳入的參數propertyName對匿名函數也有效存在。通過上一步,你已經得到的匿名函數包含propertyName,此時你就可以傳入你要比較的兩個對象,在函數內比較他們的propertyName屬性,返回比較結果。
回答4:這個就叫高階函數。
相關文章:
1. MySQL數據庫中文亂碼的原因2. 如何解決Centos下Docker服務啟動無響應,且輸入docker命令無響應?3. mysql - 新浪微博中的關注功能是如何設計表結構的?4. angular.js使用$resource服務把數據存入mongodb的問題。5. dockerfile - [docker build image失敗- npm install]6. angular.js - 關于$apply()7. android-studio - Android Studio 運行項目的時候一堆警告,跑步起來!?8. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?9. angular.js - Ionic 集成crosswalk后生成的apk在android4.4.2上安裝失敗???10. nignx - docker內nginx 80端口被占用
