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 に答える