1

我已经调试了两天的 JavaScript 代码,现在我发现它可以在 Firefox 中运行。

我将代码上传到 jsFiddle 以便您可以在那里进行测试。

它在 Firefox v23 中完美运行,但在 Chromium v​​28.0.1500.71 中无法排序。我正在使用 jQuery v1.10.1

我不知道错误是在sort()函数上还是在 jQuery 库中。

这应该被报告为 Chromium 中的错误吗?

var data = {
    "list": [
        {
            "title": "a",
            "date": "03/08/2010"
        },
        {
            "title": "b",
            "date": "31/07/2010",
        },
        {
            "title": "c",
            "date": "08/08/2010",
        },
        {
            "title": "d",
            "date": "01/08/2010"
        },
        {
            "title": "e",
            "date": "11/12/2010"
        },
        {
            "title": "f",
            "date": "10/12/2010"
        },
        {
            "title": "g",
            "date": "12/12/2010"
        },
        {
            "title": "h",
            "date": "14/12/2010"
        },
        {
            "title": "i",
            "date": "11/12/2010"
        },
        {
            "title": "j",
            "date": "05/08/2010"
        },
        {
            "title": "k",
            "date": "03/08/2010"
        }
    ]
};
// Sort
$.each(data, function (key, val) {
    val.sort(function(a, b) {
        return a.title.toLowerCase() > b.title.toLowerCase();
    });
    // The object is not sorted here
});
// Print
document.querySelector("pre").textContent = 
    JSON.stringify(data, null, 4);
4

2 回答 2

3

你的sort比较器坏了。

sort回调应返回负数0、或正数,具体取决于第一个参数是小于、等于还是大于第二个参数。

你总是返回一个布尔值,这不是它应该做的。

于 2013-08-22T18:08:59.247 回答
1

试试这样:

$.each(data, function (key, val) {
    val.sort(function(a, b) {
        return a.title.toLowerCase().localeCompare(b.title.toLowerCase());
    });
});

$("pre").text( JSON.stringify(data, null, 4) );

小提琴

localeCompare返回一个数字,指示引用字符串在排序顺序中是在给定字符串之前还是之后或与给定字符串相同,换句话说,它返回 -1、1 或 0,而将字符串与<or进行比较则>返回 true 或 false,这不是什么sort()期待。

于 2013-08-22T18:09:02.497 回答