【发布时间】:2016-05-22 15:51:16
【问题描述】:
当我按任何列对对象数组进行排序时,它工作正常...直到我的 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:所以,这就是我想要的和我得到的:
假设我的数组是:
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 = [
{'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:不,用户名不会返回 undefined
get Username(){
if (typeof this.username == 'undefined')
return '';
else return this.username;
}
我在一个类的上下文中
最终编辑:好的,我发现了问题所在,问题是我的数组是一个复杂的对象数组,我试图按属性对其进行排序,但有时,我有对于 11 个对象中的 7 个,此属性的值相同。我在 chrome 中遇到的问题是 google chrome 并不总是以相同的顺序对相等的值进行排序,而 firefox 总是保持相同的顺序。在我的代码中(在 Edit2 下方),我检查数组是否已经排序,如果是,我将其反转,它在 Firefox 中运行良好,因为它始终相同,但在 chrome 中却不是。我仍然不明白它怎么会弄乱最初的排序,但是我只是在我知道会是唯一的属性上添加了第二个排序,它解决了所有问题。
return first.localeCompare(second, undefined, {sensitivity: 'base'}) || a.name.localeCompare(b.name, undefined, {sensitivity: 'base'});
名称始终存在且唯一,因此我的数组将始终以相同的方式排序。
【问题讨论】:
-
您能发布一个直接演示您的问题的代码的 sn-p 吗?
-
到目前为止,您还没有描述问题。有什么问题?它返回未定义?它返回一个空数组?没排序?如果它没有排序,你确定它没有排序(根本没有改变)还是以意外的顺序排序?
-
对不起@slebetman,我已经编辑了我的帖子来回答你的问题
-
提供minimal reproducible example。如果没有使用代码的示例数据和上下文,我们将无法重现
-
你还没有描述问题。我随机假设它会将
[3,2,1]排序,有时排序为[1,3,2],有时排序为[3,1,2]等。我们无法回答这个问题,因为我们不知道您在说什么。
标签: javascript arrays google-chrome sorting