第二次单击时反向排序 - Javascript

发布于 2024-11-01 18:07:29 字数 570 浏览 0 评论 0原文

我有一个函数,可以在单击链接后对 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));

我的问题是让函数知道它需要哪种排序方式。我正在考虑使用布尔标志,但我似乎想不出任何有效的方法。我只是在寻找一种方法来跟踪它的排序方式,然后如果单击该按钮,它将使用第二个代码片段。 提前致谢!

I have a function that sorts a json array after a link is clicked (so the function is called using an onclick) and the function works and can sort:

function sortArch(a,b) {
x = eval("a." + sort_type).toLowerCase();  
y = eval("b." + sort_type).toLowerCase();  
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

When I click the same button I want the function to reverse sort. The reversing is easy enough:

x = eval("a." + sort_type).toLowerCase();  
y = eval("b." + sort_type).toLowerCase();  
return ((x < y) ? 1 : ((x > y) ? -1 : 0));

My problem is having the function know which way it needs to sort. I was thinking of using a boolean flag, but I can't seem to come up with anything that works. I'm only looking for a way to keep track of which way it is sorted and then if the button is clicked it resorts with the second code snippet.
Thanks in advanced!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏末染殇 2024-11-08 18:07:29

你可以这样做:

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

顺便说一句:不必要时尽量不要使用 eval,它既慢又乱

You could do something like this:

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: try not to use eval when you don't have to, it is slow and messy

最终幸福 2024-11-08 18:07:29

您即将完成:

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));

干杯!

You're almost done:

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);
    }
}

Examples of use:

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));

Cheers!

请爱~陌生人 2024-11-08 18:07:29

建议您使用布尔标志:

function sort(reverse){
  if(reverse){
    //reverse sort code
  }else{
    //normal sort code
  }
}

bottonElement.onclick = function(){sort(true);}; //or use addEventHandler

这也允许使用 sort() cass,它会自动执行正常排序,因为 undefined 是“falsy”。

Your idea of using a boolean flag is recommended:

function sort(reverse){
  if(reverse){
    //reverse sort code
  }else{
    //normal sort code
  }
}

bottonElement.onclick = function(){sort(true);}; //or use addEventHandler

This also allows a sort() cass, which automatically does a normal sort since undefined is "falsy".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文