Lia*_*eng 5 javascript sorting
背景:
根据某些任务的需要,我需要一个简单的排序功能.为简单起见,我编写了另一个函数来将内置排序函数包装为:
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;
}
Run Code Online (Sandbox Code Playgroud)
我的尝试是:
例如,
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'}
};
Run Code Online (Sandbox Code Playgroud)
有几种用法:
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
Run Code Online (Sandbox Code Playgroud)
题
虽然它在我们的代码中按预期工作,但我想提出一些问题:
感谢 Andy,我们将代码更改为
var f = new Function('a, b, ai, bi, e', 'return ' + func);
请注意,参数应作为字符串传入,请查看: https: //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function
关于第二个问题,我认为这是因为我们试图使排序功能更加明确。例如,
排序([1, 2, 3, 5, 1], '', 'a < b') ==> [1, 1, 2, 3, 5]
'a < b' 对我们来说的字面意思是“后一项大于前一项”,因此数组被排序为 [1, 1, 2, 3, 5]。
另一个例子,“a.age < b.age”将按照年轻人在老年人之前的顺序返回记录。
这就是我问我们是否可以使用 true 或 false 来代替 -1, 0, 1 的原因。
我们不断做了一些小测试,搞清楚了一些东西,想和大家分享。
例如:
var b = [
{age:27, name:'pop 2', role: 'Programmer'},
{age:19, name:'james', role: 'Accontant'},
{age:19, name:'jerry', role:'Sales Representative'},
{age:22, name:'jerry', role:'Coder'},
{age:19, name:'jerry', role:'Tester'},
{age:14, name:'anna', role: 'Manager'},
{age:19, name:'luke', role:'Analyst'},
{age:27, name:'pop', role: 'Programmer'},
{age:14, name:'anna 2', role: 'Manager'}
];
b.sort(function(a, b) {return a.age - b.age > 0? 1: -1}); // #1
b.sort(function(a, b) {return a.age > b.age}); // #2
b.sort(function(a, b) {return a.age - b.age}); // #3
Run Code Online (Sandbox Code Playgroud)
尽管上述排序返回相同的结果,但请尝试以下一种:
b.sort(function(a, b) {return a.age - b.age < 0? -1: 1}); // #4
Run Code Online (Sandbox Code Playgroud)
在此语句中,记录仍然按年龄排序,但在同一年龄组内顺序相反。
#1 和#2 碰巧与#3 相同。如果浏览器使用不同的算法来实现排序功能,则#1和#2可能会表现得像#4。如果对结果的顺序要求严格,则当“a”等于“b”时,需要显式返回 0。
此外,正如 Andy 指出的,在某些情况下(例如#4),如果我们不显式返回 0,则可能会进行不必要的交换,这可能会影响性能。
我们之前没有注意到这一点的原因是因为我们不关心组内的顺序,只要记录按某些属性排序即可。
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |