【问题标题】:javascript array length > 10 sort google chromejavascript数组长度> 10排序谷歌浏览器
【发布时间】: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


【解决方案1】:

嗯,我在 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);

附:对于上面的 sn-p,您不需要将未定义的用户名转换为 ""。

【讨论】:

  • 谢谢你。我赞成你的回答,但我无法验证它,因为它不能解决我的问题,但你让我尝试再试一次,所以我发现出了什么问题,要编辑我的帖子以显示它。
  • @PineApple34:酷.. 我对解决方案很好奇。让我们知道问题所在。
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2017-03-29
  • 2012-08-18
  • 1970-01-01
  • 2016-12-07
  • 2012-05-24
  • 2012-09-19
相关资源
最近更新 更多