Firefox不会对对象数组进行排序,但是Chrome和Opera会

时间:2018-12-05 10:23:09

标签: javascript sorting firefox

当我尝试对对象数组进行排序时,它在Chrome和Safari中运行顺利,但Firefox根本无法对其进行排序。

您可以在此处查看其JSFiddle。单击表格标题进行排序: http://jsfiddle.net/g5y3smu0/

这是在所有3种浏览器中均可进行排序的小提琴:http://jsfiddle.net/srp89xyg/

您会在后面的小提琴中看到我不再使用localeCompare(),然后它就像一个符咒,但这并不是我想要的那种。

我已经checked,并且Firefox已经很长时间支持localeCompare()

我很困惑这里可能是什么问题...有人知道怎么回事或解决此问题的方法吗?

请注意,我只是为了解决这个问题而制作了小提琴。我正在使用AngularJS应用程序,并选择将React样板用作小提琴。不要因为没有使用React的最佳实践而对我之以鼻;)

1 个答案:

答案 0 :(得分:0)

查看您的代码,似乎您正在使用localCompare并在结果大于或等于localCompare的情况下模拟结果。

我在sortRecipientsByProperty中简化了这部分代码,使用Firefox,当您单击时,数据按a-z排序,如果再次单击,则按z-a排序。

if (this.state[prop] === undefined || this.state[prop] === false) {
    this.state.items.sort((a, b) => (a[prop].localeCompare(b[prop], {ignorePunctuation: true})));
}
else {
    this.state.items.sort((a, b) => (b[prop].localeCompare(a[prop], {ignorePunctuation: true})));
}

您的代码中有一个使用localeCompare的错字,因此结果不正确:

this.state.items.sort(
    (a, b) => (
        (a[prop].localeCompare(b[prop], {ignorePunctuation: true})) < 0 ? -1 : 
        (b[prop].localeCompare(a[prop], {ignorePunctuation: true})) > 0 ? 1 : 0));

您首先要对a进行b检验,然后对a进行b检验,然后在两种情况下都要对a进行a检验(或者对a始终进行b检验或不将检验<0更改为> 0)。 只是为了解释,因为localeCompare已经处理了所有情况,最好只使用一次。