javascript - 關(guān)于比較函數(shù)的問(wèn)題
問(wèn)題描述
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;} }};這是紅寶書中一個(gè)知識(shí)點(diǎn),這段代碼不是太明白
問(wèn)題解答
回答1:這是為了比較特定數(shù)據(jù)結(jié)構(gòu)而制造的工具函數(shù)。例如數(shù)據(jù)結(jié)構(gòu)格式為:
let arr = [{ name: ’foo’, value: 123 }, { name: ’bar’, value: 456 }]
這時(shí),一般的 sort 方法需要這么編寫,形如:
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
這段代碼存在的問(wèn)題:
硬編碼了 value 參數(shù),排序其它字段時(shí)必須重新編碼。
返回 1 / -1 的邏輯是冗余而無(wú)聊的。
直接編寫排序的匿名函數(shù),在紅寶書的年代可讀性不夠好(現(xiàn)在有箭頭函數(shù),其實(shí)問(wèn)題不大)。
所以對(duì)上面的 case,紅寶書作者設(shè)計(jì)了一個(gè)通用的工具函數(shù),以生成一個(gè)【用于排序特定字段】的函數(shù)。注意你調(diào)用這個(gè)工具函數(shù),返回的是一個(gè)新函數(shù),而不是排序的結(jié)果(所謂高階函數(shù))。
應(yīng)用這個(gè)封裝后,代碼形如:
// 創(chuàng)造一個(gè)【根據(jù) value 字段來(lái)排序】的函數(shù)let compareFn = createComparisonFunction(’value’)// 將創(chuàng)造的函數(shù)傳入 sort 中作為排序依據(jù)arr.sort(compareFn)
這就起到了簡(jiǎn)化業(yè)務(wù)邏輯的作用。
回答2:什么不明白, 就是比較兩個(gè)對(duì)象某個(gè)屬性的大小createComparisonFunction('test')({’test’: 1}, {'test': 2})返回的是-1
回答3:調(diào)用函數(shù)時(shí),分為兩步來(lái)看。首先通過(guò)createComparisonFunction()傳入比較的字段。在createComparisonFunction()函數(shù)內(nèi),返回一個(gè)匿名函數(shù)。同時(shí)由于匿名函數(shù)處在createComparisonFunction()內(nèi),所以你對(duì)createComparisonFunction()傳入的參數(shù)propertyName對(duì)匿名函數(shù)也有效存在。通過(guò)上一步,你已經(jīng)得到的匿名函數(shù)包含propertyName,此時(shí)你就可以傳入你要比較的兩個(gè)對(duì)象,在函數(shù)內(nèi)比較他們的propertyName屬性,返回比較結(jié)果。
回答4:這個(gè)就叫高階函數(shù)。
相關(guān)文章:
1. html5 - css3scale和rotate同時(shí)使用轉(zhuǎn)換成matrix寫法該如何轉(zhuǎn)換?2. win10 python3.5 matplotlib使用報(bào)錯(cuò)3. php多任務(wù)倒計(jì)時(shí)求助4. css - 如何把一個(gè)視圖放在左浮動(dòng)定位的視圖的上面?5. javascript - jquery怎么讓a標(biāo)簽跳轉(zhuǎn)后保持tab的樣式6. MySQL的聯(lián)合查詢[union]有什么實(shí)際的用處7. javascript - vue組件的重復(fù)調(diào)用8. javascript - 小demo:請(qǐng)教怎么做出類似于水滴不斷擴(kuò)張的效果?9. python的正則怎么同時(shí)匹配兩個(gè)不同結(jié)果?10. javascript - axios請(qǐng)求回來(lái)的數(shù)據(jù)組件無(wú)法進(jìn)行綁定渲染
