javascript数组长度> 10种谷歌浏览器

时间:2016-05-22 15:51:16

标签: javascript arrays google-chrome sorting

当我按任意列对对象数组进行排序时,它工作正常......直到我的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'});

名称始终存在且唯一,因此我的数组将始终以相同的方式排序。

1 个答案:

答案 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。对于上面的代码段,您无需将未定义的用户名转换为“”。