背景排序功能:關於JavaScript的
根據需要在某些任務,我需要一個簡單的排序功能。爲簡單起見,我寫了另一個功能包內置的排序功能:
function sortBy(obj, extra, func){
if(typeof func == 'function'){
f = func;
} else if(typeof extra != 'function'){
eval('function f(a, b, ai, bi, e){return ' + func + '}');
} else {
var f = extra;
extra = null;
}
var res = [];
for(var i in obj){
if(obj.hasOwnProperty(i)){
obj[i]._k_ = i;
res.push(obj[i]);
}
}
res.sort(function(a, b){
if(f(a, b, a._k_, b._k_, extra)){
return 1;
} else {
return -1;
}
})
return res;
}
我的企圖是:
- 使其能夠排序對象直接
- 保留原來的對象哈希表
- 允許一些簡單的語法
例如,
var data ={
12: {age:27, name:'pop', role: 'Programmer'},
32: {age:25, name:'james', role: 'Accontant'},
123:{age:19, name:'jerry', role:'Sales Representative'},
15:{age:22, name:'jerry', role:'Coder'},
17:{age:19, name:'jerry', role:'Tester'},
43:{age:14, name:'anna', role: 'Manager'},
55: {age:31, name:'luke', role:'Analyst'}
};
有幾種用途:
var b = sortBy(data, '', 'a.age < b.age'); // a simple sort, order by age
var b = sortBy(data, 19, 'b.age == e'); // pick up all records of age 19, and put them in the beginning
var b = sortBy(data, function(a, b){return a.name > b.name}); // anonymous sort function is also allowed
問題
雖然它按預期工作在我們的代碼,我想提出一些問題:
- 有關於使用eval從字符串創建排序函數的任何potiential問題?
- 有沒有關於排序函數返回-1(負數),0和1(正數)的故事? 我們是否可以將代碼更改爲「return if(f(a,b,a。k,b。k,extra)」,而不是返回1或-1?我們發現它適用於我們的firefox和chrome ,但不能確定它是否是安全的這樣做。
爲什麼不使用已存在的排序函數? – dave
@dave他是:「我編寫了另一個函數來將*內置的排序函數*包裝爲...「 –
如果我不記得錯誤的排序函數只是針對Array對象的,對吧? –