在Chrome中,为什么在排序多次运行时对较长的数组翻转条目进行排序?

时间:2015-08-31 17:39:53

标签: javascript arrays sorting v8

修改 此问题似乎只发生在Chrome中。

我正在对包含人员信息的对象数组进行排序。排序基于姓氏(升序)。

数组中有44个对象,数组中的一些人的姓氏匹配。

我目前如何排序:

people.sort(function (a, b) {
    return a.last_name.localeCompare(b.last_name);
});

当多次对数组进行排序时,会导致某些具有相同姓氏的人被交换或重新组织。

然而,当我删除数组中的最后一个对象并重新运行模拟时,这种求助将停止在至少一个地方发生。

如果我删除更多随机对象(但不删除具有相同姓氏的对象),则所有对象都停止在多个度假村重新组织。

我认为它可能是localeCompare()函数,但我尝试了以下仍然存在相同问题的代码。

people.sort(function(a, b){
    if(a.last_name < b.last_name) return -1;
    if(a.last_name > b.last_name) return 1;
    return 0;
});

这必须与方法sort()的构建方式以及有大型数组时的工作方式有关。

这是一个JSFiddle,其中包含有关如何复制问题的说明:http://jsfiddle.net/kevbot/kro30wy0/

如何在执行多个度假村时停止重组数据?

注意:我意识到假设不会改变多次的数组是愚蠢的。但是......这个例子是一个基本的例子。实际实现将动态添加更多人物对象,并且每次都需要使用。

1 个答案:

答案 0 :(得分:2)

是的,这是因为排序工作的方式。如果您希望始终对匹配的订单(localcompare给出0)具有相同的订单,则需要为这些订单另外订购。这是使用ids的示例:

people.sort(function (a, b) {
    var compare = a.last_name.localeCompare(b.last_name);
    if(compare == 0) return a.id < b.id
    return compare
});

如果不是返回a.id < b.id你做console.log(a,b),你会注意到对于2个姓氏相同的人,在一个循环中a = firstPerson,b = secondPerson但在第二个循环中,a = secondPeron和b = firstPerson,在这些情况下,它们会在排序上交换