使用自定义功能排序,提供反向结果

时间:2013-04-05 16:37:32

标签: javascript arrays sorting

我有以下数组(此处显示为JSON):

[{
    "value": -1,
    "absolute": false,
    "callTime": 0
}, {
    "value": 23,
    "absolute": true,
    "callTime": 1365179295887
}, {
    "value": 1,
    "absolute": false,
    "callTime": 0
}, {
    "value": 1,
    "absolute": true,
    "callTime": 0
}]

我需要通过将具有最高callTime属性值的对象放在数组顶部来对此数组进行排序。

我使用以下代码(基于主题offered by MDN的解释):

var handlers = JSON.parse("[...]");

handlers.sort(function(firstHandler, secondHandler) {
    if (firstHandler.callTime < secondHandler.callTime) {
        return -1; // sort firstHandler to a lower index than secondHandler.
    } else {
        return 1; // sort secondHandler to a lower index than firstHandler.
    }

    return 0;
});

console.log(JSON.stringify(handlers));

运行该函数后,我得到以下输出:

[{
    "value": 1,
    "absolute": true,
    "callTime": 0
}, {
    "value": 1,
    "absolute": false,
    "callTime": 0
}, {
    "value": -1,
    "absolute": false,
    "callTime": 0
}, {
    "value": 94,
    "absolute": true,
    "callTime": 1365179553381
}]

这似乎与我期望的相反(请注意callTime与零不同的唯一对象是如何在底部)。

我认为在这里我可能会遗漏一些大事,或者我可能只是误导了,但也将功能的主体改为:

return firstHandler.callTime - secondHandler.callTime

应该给出正确的结果,但似乎没有。

我可能做错了什么?

1 个答案:

答案 0 :(得分:1)

您的排序功能不正确。逻辑相反,因为您的sort函数指示较小值为callTime的元素首先出现,而您希望较大的值位于数组的顶部。此外,您始终返回-1或1,而不是0.当元素绑定时,它应返回0.

重写如下:

handlers.sort(function(firstHandler, secondHandler) {
    if (firstHandler.callTime > secondHandler.callTime) {
        return -1; // sort firstHandler to a LOWER index than secondHandler.
    } else if (firstHandler.callTime < secondHandler.callTime) {
        return 1; // sort secondHandler to a LOWER index than firstHandler.
    }

    return 0; // sort firstHandler and secondHandler as equal
});