在 Chrome 中,为什么当排序多次 运行 时,对较长的数组进行排序会翻转条目?
In Chrome, why does sorting a longer array flip entries when the sort is ran multiple times?
编辑
这个问题似乎只发生在 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/
如何在执行多个度假村时停止这种数据重组?
注意:我意识到求助于只改变一次的数组是愚蠢的。但是......这个例子是一个基本的例子。实际实现中会动态添加更多的人对象,每次都需要求助。
是的,发生这种情况是因为排序的工作方式。如果您希望匹配的那些总是具有相同的顺序(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,在这些情况下,他们在排序时交换
编辑 这个问题似乎只发生在 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/
如何在执行多个度假村时停止这种数据重组?
注意:我意识到求助于只改变一次的数组是愚蠢的。但是......这个例子是一个基本的例子。实际实现中会动态添加更多的人对象,每次都需要求助。
是的,发生这种情况是因为排序的工作方式。如果您希望匹配的那些总是具有相同的顺序(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,在这些情况下,他们在排序时交换