当我按任意列对对象数组进行排序时,它工作正常......直到我的array.length> 10 ...在谷歌浏览器上(在Firefox中仍能正常工作)。
编辑:当数组长度超过10时的问题是排序只是“随机”排序我的数组。
所以我检查了我的排序函数是否返回了有效的东西(0,负整数或正整数),是的,是的。
我通过在返回
之前做一个简单的console.log来检查这个console.log(a.wins - b.wins); // when comparing integers
console.log(a.name.localeCompare(b.name, undefined, {sensitivity: 'base'})); // when comparing strings
我在我的控制台中输出的数字只是数字(对于字符串比较,-1或0或1,对于整数比较,从-5到140)
有什么想法解决我的问题吗?
EDIT2:好吧,让我们尝试一些代码,这是我比较用户名时的代码
// So, when I click on Username column of my table, it calls this function
// The array I need to sort & display is: summoners
// You can see that I'm doing something weird in case my username is empty,
// that's the way I found to put blank names after the 'z' letter so they
// appear at the end of the list when sorted ascending
if (jQuery(this).html() == 'Username'){
var clonedSummoners = _.map(summoners, _.clone);
summoners = summoners.sort(function(a, b){
var first, second;
if (a.Username == '')
first = 'zzzzzzzzzzzzzzzzzzzzzz';
else
first = a.Username;
if (b.Username == '')
second = 'zzzzzzzzzzzzzzzzzzzzzz';
else
second = b.Username;
console.log(first.localeCompare(second, undefined, {sensitivity: 'base'}));
return first.localeCompare(second, undefined, {sensitivity: 'base'});
});
var testSort = true;
for(var i=0; i<summoners.length; i++)
if (summoners[i].id != clonedSummoners[i].id)
testSort = false;
if (testSort == true)
summoners = summoners.reverse();
}
drawSummoners();
编辑3:所以,这就是我想要的&amp;我得到了什么:
假设我的数组是:
summoners = [
{'username' : 'calpton', 'age' : 19},
{'username' : 'comics', 'age' : 12},
{'username' : 'hello', 'age' : 17},
{'username' : 'newyork', 'age' : 47},
{'username' : 'physics', 'age' : 14},
{'username' : '', 'age' : 1},
{'username' : 'azerty', 'age' : 2},
{'username' : 'bob', 'age' : 5},
{'username' : 'hello', 'age' : 37},
{'username' : 'henry', 'age' : 17},
{'username' : 'therapy', 'age' : 27}
];
在调用上面的函数后,我希望我的summoners数组按照这种方式排序
summoners = [
{'username' : 'azerty', 'age' : 2},
{'username' : 'bob', 'age' : 5},
{'username' : 'calpton', 'age' : 19},
{'username' : 'comics', 'age' : 12},
{'username' : 'hello', 'age' : 17}, // it doesn't matter
{'username' : 'hello', 'age' : 37}, // for these ones
{'username' : 'henry', 'age' : 17},
{'username' : 'newyork', 'age' : 47},
{'username' : 'physics', 'age' : 14},
{'username' : 'therapy', 'age' : 27},
{'username' : '', 'age' : 1},
];
但我会改为:
summoners = [
{'username' : 'calpton', 'age' : 19},
{'username' : 'bob', 'age' : 5},
{'username' : 'hello', 'age' : 37},
{'username' : 'henry', 'age' : 17},
{'username' : 'comics', 'age' : 12},
{'username' : 'hello', 'age' : 17},
{'username' : 'newyork', 'age' : 47},
{'username' : 'physics', 'age' : 14},
{'username' : '', 'age' : 1},
{'username' : 'azerty', 'age' : 2},
{'username' : 'therapy', 'age' : 27}
];
所以,我猜它不是随机的,因为它总会按照这种方式排序,但排序没有意义。
EDIT4:不,用户名不返回未定义
get Username(){
if (typeof this.username == 'undefined')
return '';
else return this.username;
}
我在班级
的背景下最终编辑:好的,我发现问题是什么,问题是我的数组是一个复杂的对象数组,我试图通过属性对它进行排序但有时,我有对于11个对象中的7个,此属性的值相同。我在chrome中遇到的问题是,谷歌浏览器并不总是按相同的顺序排序相同的值,而firefox总是保持相同的顺序。在我的代码中(在Edit2下面),我检查数组是否已经排序,如果是,我反转它,它在firefox中运行良好,因为它总是相同的,在chrome中它不是。我仍然不知道如何搞砸了最初的排序,但是,我只是在一个我认为独特的属性上添加了第二种,它解决了所有问题。
return first.localeCompare(second, undefined, {sensitivity: 'base'}) || a.name.localeCompare(b.name, undefined, {sensitivity: 'base'});
名称始终存在且唯一,因此我的数组将始终以相同的方式排序。
答案 0 :(得分:0)
我是按照以下方式在Chrome v51中完成的,结果与预期一致。
var summoners = [
{'username' : 'calpton', 'age' : 19},
{'username' : 'comics', 'age' : 12},
{'username' : 'hello', 'age' : 17},
{'username' : 'newyork', 'age' : 47},
{'username' : 'physics', 'age' : 14},
{'username' : '', 'age' : 1},
{'username' : 'azerty', 'age' : 2},
{'username' : 'bob', 'age' : 5},
{'username' : 'hello', 'age' : 37},
{'username' : 'henry', 'age' : 17},
{'username' : 'therapy', 'age' : 27}
],
sorted = summoners.sort((a,b) => { var f = a.username || "zzz",
s = b.username || "zzz";
return f.localeCompare(s, void 0, {sensitivity: "base"});
});
console.log(sorted);
P.S。对于上面的代码段,您无需将未定义的用户名转换为“”。