【问题标题】:JavaScript: Sorting with exceptionJavaScript:异常排序
【发布时间】:2013-06-23 03:47:00
【问题描述】:

假设我有一个对象数组(为了更简单的显示目的,我将其显示为一个数组)

[ 'TEST', 'NEW', 'ALPHA', 'ZOO', 'WHATEVER' ]

我需要按字母顺序对其进行排序(简单的部分),但是,我需要以某种方式对它进行排序,例如NEW 将在最后结束。

[ 'ALPHA', 'TEST', 'WHATEVER', 'ZOO', 'NEW' ]

这是我用来排序的函数

var sortedWords = function(a, b) {
    return a.word > b.word ? 1 : -1 ;
};

所以,我得到 sortedWords 数组,然后再次检查它,创建另一个数组并将单词推入新数组,除非单词等于 NEW。在这种情况下,我将它放在一边,并在返回它之前附加到这个新数组的最后。必须有更好、更有效的方法来做到这一点。

谢谢。

【问题讨论】:

  • 返回前:if(a == 'youWord'){return 1;}
  • @BrianHannay 将此作为答案发布!
  • @BrianHannay 请记住,如果ab 都是目标词,则结果必须为0。

标签: javascript


【解决方案1】:

更改您的比较器以首先查找NEW

function (a, b) {
    if ((a.word === 'NEW') != (b.word === 'NEW')) {
        return a.word === 'NEW' ? 1 : -1;
    }
    return a.word > b.word ? 1 :
           a.word < b.word ? -1 : 0;
}

【讨论】:

  • 谢谢,克里斯!这正是我所需要的,但显然我必须等待 7 分钟才能接受这个答案:)
  • @solefald 你能检查一下这个jsfiddle.net/blackjim/X6krQ 吗?也许我错过了什么。
  • @Antonis:是的。由于您正在对平面数组进行排序(我对对象数组进行排序),因此您需要将 a.word 更改为 ab.word 更改为 b
  • @solefald 这不是提交的代码。初始代码不起作用。
  • @Antonis:在我原来的问题中?见第一行。我提到为了简单的显示目的,我将展示它是一个平面阵列。 Chris 的解决方案在我的情况下效果很好,显然需要进行一些调整以匹配我的对象元素名称和我匹配的单词。
【解决方案2】:

您可以如下定义比较器函数:

var sortedWords = function(a, b) {
    if (a.word === b.word) {
        // a and b are considered equal, the order is okay
        return 0;   
    }

    if (a.word === "NEW") {
        // "NEW" is considered larger than every other value, the order is wrong
        return 1;
    }

    // Correct order if b equals "NEW", otherwise lexicographical comparison
    return b.word === "NEW" ? -1 : (a.word > b.word ? 1 : -1);
};

【讨论】:

  • 你能解释一下这是一个答案而不是评论吗?
  • @Blender:那时我还没有粘贴我的小提琴代码。
【解决方案3】:

Use sort with a custom compareFunction

var ar = [ 'ALPHA', 'WHATEVER', 'NEW', 'ZOO', 'TEST' ];

ar.sort(function(a, b){
    var wordToBeLast = 'NEW';  // set your word here

    if(a===wordToBeLast){
        return 1;
    } else if(b===wordToBeLast){
        return -1;
    } else {
        return a > b; 
    }
});

【讨论】:

    猜你喜欢
    • 2012-07-23
    • 2013-04-12
    • 1970-01-01
    • 2017-07-04
    • 2016-07-09
    • 2014-03-25
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多