1

我有以下数组(这里显示为 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属性值的对象放在数组顶部来对该数组进行排序。

我使用以下代码(基于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

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

我可能做错了什么?

4

1 回答 1

1

您的排序功能不正确。逻辑是相反的,因为您的排序函数表明具有较小值的元素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
});
于 2013-04-05T16:41:29.723 回答