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中的错误有关(似乎是早就可以解决的问题)。有人知道我的排序语法有什么问题吗?
边缘中控制台日志的屏幕截图:
答案 0 :(得分:5)
问题是,您返回比较值true
或false
,它被解释为1
和0
的数值。基本上,它会丢失返回成功排序所必需的-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);