假設我們用一個數組保存一組學生的基本信息。
var studentsData = [{name:"mike",age:17}, {name:"loren",age:16}, {name:"frank",age:18}];
現在,我們需要對這個數組按照姓名(name)字段進行升序排序,在這個場景內,使用數組的sort(compareFunction)方法進行排序,該方法的參數是一個比較函數。
比較函數接收兩個參數,如果第一個參數應該位於第二個之前則返回一個負數,如果兩個參數相等則返回0,如果第一個參數應該位於第二個之后則返回一個正數。
以下為按照name字段進行排序:
function compareFunctionByName(object1,object2){ var value1=object1["name"]; var value2=object2["name"]; if(value1<value2){ return -1; }else if(value1==value2){ return 0; }else{ return 1; } }; studentsData.sort(compareFunctionByName);
結果:
frank
loren
mike
這樣的排序寫法簡單有效,但是,如果此時需求變更,除了name外還需要對學生的age進行排序時,一般的做法是另外寫一個按照age字段進行排序的比較函數,然后在調用的地方作個條件判斷,決定使用哪一個版本的比較函數。
新增加版本的比較函數如下:
function compareFunctionByAge(object1,object2){ var value1=object1["age"]; var value2=object2["age"]; if(value1<value2){ return -1; }else if(value1==value2){ return 0; }else{ return 1; } };
上面的寫法工作的很好,但是兩個版本的比較函數除了比較字段的不同外,其余部分均相同,如果又增加了對其他字段進行排序需求的話,代碼的冗余度大大增加,而且代碼會越來越丑陋。
當這種場景發生時,我們就需要用到js函數中一個非常有用的特性:將一個函數作為另一個函數的返回值。
具體作法,寫一個生成函數,該生成函數根據字段名生成相應版本的比較函數,並將比較函數返回作為sort方法的參數。
如下:
function createCompareFunction(fieldName){ return function(object1,object2){ var value1=object1[fieldName]; var value2=object2[fieldName]; if(value1<value2){ return -1; }else if(value1==value2){ return 0; }else{ return 1; } }; }
//按照name字段進行排序
studentsData.sort(createCompareFunction("name"));
//按照age字段進行排序
studentsData.sort(createCompareFunction("age"));
如此便解決了高冗余度的問題,並且通用性良好。
javascript函數的這一特性在實際中應用點很多,繼續挖掘中。。。
^_^。