我有一个函数可以在单击链接后对json数组进行排序(因此使用onclick调用该函数)并且该函数可以正常排序:
function sortArch(a,b) {
x = eval("a." + sort_type).toLowerCase();
y = eval("b." + sort_type).toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
当我点击同一个按钮时,我希望该功能可以反向排序。逆转很容易:
x = eval("a." + sort_type).toLowerCase();
y = eval("b." + sort_type).toLowerCase();
return ((x < y) ? 1 : ((x > y) ? -1 : 0));
我的问题是让函数知道它需要排序的方式。我正在考虑使用布尔标志,但我似乎无法想出任何有用的东西。我只是想找到一种方法来跟踪它的排序方式,然后如果单击该按钮,它将使用第二个代码片段进行调整。 先谢谢!
答案 0 :(得分:3)
你可以这样做:
function mySort(desc) {
var mod = desc ? -1 : 1;
return function(a,b) {
var lca = a[sort_type].toLowerCase(),
lcb = b[sort_type].toLowerCase();
return lca > lcb ? 1 * mod : lca < lcb -1 * mod : 0;
}
}
arr.sort(mySort(true)); //sort descending
arr.sort(mySort(false)); //sort ascending
btw:尽量不要使用eval,它很慢而且很乱
答案 1 :(得分:1)
你差不多完成了:
function compareFunc(sort_type, ascending) {
var direction = ascending ? 1 : -1;
return function(a, b) {
x = a[sort_type].toLowerCase();
y = b[sort_type].toLowerCase();
return direction * x.localeCompare(y);
}
}
使用示例:
persons = [
{firstName: 'John', lastName: 'Foo'},
{firstName: 'Bob', lastName: 'Bar'}
];
// In your button click events, use compareFunc to generate the right function :
persons.sort(compareFunc('firstName', true));
// or
persons.sort(compareFunc('firstName', false));
// or
persons.sort(compareFunc('lastName', true));
// or
persons.sort(compareFunc('lastName', false));
干杯!
答案 2 :(得分:0)
建议您使用布尔标志:
function sort(reverse){
if(reverse){
//reverse sort code
}else{
//normal sort code
}
}
bottonElement.onclick = function(){sort(true);}; //or use addEventHandler
这也允许sort()
cass,由于undefined
是“假的”,它会自动进行正常排序。