Microsoft Edge array.sort(compareFunction)无法正确排序

时间:2018-07-05 17:50:45

标签: javascript arrays sorting

Microsoft Edge版本:41.16299.402.0

我注意到Edge的一个奇怪之处在于,使用array.sort()提供匿名函数似乎无法正确排序我的对象数组。我的功能可以在Firefox和Chrome中运行。以下代码作为我遇到的问题的示例:

data = [
    {title: "First", language: "English"}, 
    {title: "Second", language: "Armenian"},
    {title: "Third", language: "Cantonese"}
];

data.forEach(function(val){
    console.log(val);
});

data.sort(function(a,b) { console.log(a.language > b.language); return a.language > b.language;});

data.forEach(function(val){
    console.log(val);
});

如果您在Chrome或Firefox中的JSFiddle中运行该代码,则会注意到第二组控制台日志是按语言按字母顺序排序的。但是在Edge中运行它,两组之间没有任何区别。我假设这与我处理sort()的方式有关,而不是与Edge中的错误有关(似乎是早就可以解决的问题)。有人知道我的排序语法有什么问题吗?

来自 Chrome 的控制台日志的屏幕截图: enter image description here

边缘中控制台日志的屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:5)

问题是,您返回比较值truefalse,它被解释为10的数值。基本上,它会丢失返回成功排序所必需的-1的值。

var data = [{ title: "First", language: "English" }, { title: "Second", language: "Armenian" }, { title: "Third", language: "Cantonese" }];

data.sort(function(a, b) { 
    return a.language > b.language || -(a.language < b.language);
});

console.log(data);

仅出于完整性考虑,对于字符串,您可以使用String#localeCompare,它具有更多功能,例如自然排序或局部化。

var data = [{ title: "First", language: "English" }, { title: "Second", language: "Armenian" }, { title: "Third", language: "Cantonese" }];

data.sort(function(a, b) { 
    return a.language.localeCompare(b.language);
});

console.log(data);