【问题标题】:Subsequent sort of multidimensional arrays yields unexpected results后续排序的多维数组会产生意想不到的结果
【发布时间】:2013-09-05 23:21:10
【问题描述】:

我有一个排序异常,我可以在 Chrome 版本 28.0.1500.71 Ubuntu 12.04 (28.0.1500.71-0ubuntu1.12.04.1) 中重现,这是我今天可用的,但我在Firefox 的最新版本也是如此。

给定以下代码:

<SCRIPT type="text/javascript">
var ary=[];
for(var x=0; x<11; x++){
    var tmp=[];
    tmp[0]="COL" + ("00" + x).substr(-3);
    tmp[1]= Math.floor(x/3);
    ary[x]=tmp;
}
ary.sort(function(a,b){
    if(a[0]>b[0]){return 1}
    if(a[0]<b[0]){return -1}
    return 0;
});
console.log(ary.toString());
ary.sort(function(a,b){
    if(a[1]>b[1]){return 1}
    if(a[1]<b[1]){return -1}
    return 0;
});
console.log(ary.toString());
</SCRIPT>

您可以(可能)看到,第一次排序的结果显示 ary[] 按第 0 列正确排序,但在第二次排序之后,当 a[1]==b[1] 时,排序之前执行的操作现在(可能)被反转。

如果 x 的迭代次数较少,则第二次排序(可能)返回预期结果。

我已经看到了一段时间,但现在我需要能够按任意列对多达 15000 行进行排序,然后是另一个,然后是另一个,而不会丢失之前排序时的排序顺序 [ ?]==b[?]。我认为这是预期的行为。

我猜这是 javascript 排序算法内置的一个省时功能,但有一个无法预料的副作用。

当当前排序中的 a==b 时,是否有一种灵丹妙药可以让我不必遍历之前的每个排序?

编辑: @ameer:好的,这是一个可行的“灵丹妙药”吗?

我们可以给数组添加一个索引值,排序的时候,如果我们的值相等,就可以根据索引本身排序。

for(var x=0; x<ary.length; x++){ary[x].index = x;}
ary.sort(function(a,b){
    if(a[2]>b[2]){return 1;}
    if(a[2]<b[2]){return -1;}
    if(a.index>b.index){
        return 1;
    }
    return -1;
});

当我们放入索引时,我们可以知道之前的排序对数组做了什么,并在我们当前的排序中保持 a[?]==b[?] 的排序顺序。

我想知道这有多快 - 我还想知道如何在排序期间重新编号索引,而不是在每次排序之前重新创建它们,但我担心它会因为相同的值而放弃排序。也许我们可以添加一个在排序过程中发生变化的 newIndex 属性,然后将 index 的值设置为 newIndex 值。

有什么建议吗?

【问题讨论】:

    标签: javascript arrays sorting multidimensional-array


    【解决方案1】:

    问题是javascript中的排序不能保证稳定(如果元素相等,则不能保证元素的顺序)见here

    【讨论】:

    • 我想这解决了这个问题 - 我希望自己犯错,因为这有点大问题。
    猜你喜欢
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2019-04-05
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多