2011-12-17 2 views
1

JavaScriptのオブジェクトの配列を持っています。特定のメトリックでソートしたいと思います。特別なケースでは、メトリックが毎回同じ値を持つようになります。ここでは例の配列は次のとおりです。JavaScript [] .sort()メソッドは、要素だけを残す必要があるときにソートします

myArray.sort(function(a, b){ return 0; }); 

は、アレイがソートされます:私はこの呼び出しのような単純なものを作る

var myArray = [{"key":400686,"metric":999999},{"key":52601288,"metric":999999},{"key":1380180030,"metric":999999},{"key":909661,"metric":999999},{"key":401336,"metric":999999},{"key":1317275,"metric":999999},{"key":8642696,"metric":999999},{"key":1374360020,"metric":999999},{"key":602871933,"metric":999999},{"key":410174,"metric":999999},{"key":503411,"metric":999999},{"key":401511,"metric":999999},{"key":410196,"metric":999999},{"key":419377,"metric":999999},{"key":429167,"metric":999999},{"key":609656,"metric":999999},{"key":837941,"metric":999999},{"key":2410791,"metric":999999},{"key":4501004,"metric":999999},{"key":8633371,"metric":999999},{"key":1356540155,"metric":999999},{"key":1374360757,"metric":999999}]; 

! sort関数の戻り値0は等しいことを示しているので、明らかに残さなければなりません。

誰でもこの問題が発生していますか?

答えて

3

ソートがが不安定なであるために発生しますが、必ずしも等しいアイテムの相対的な順序は保持されません。

merge sortのようなstable sortingアルゴリズムを使用できます。

4

は、要素が等価であることを意味する等価性を示します。彼らが動かないことを意味するものではありません。それは、自由にスワップされたり、どこに残っていても配列がまだソートされていることを意味します。

1

同じ要素を予測可能な順序にソートするには、どの要素が別の要素の前にあるかを識別できる2次キーが必要です。あなたが同じのために、既存の秩序を維持したい場合は、

myArray.sort(function(a, b){ 
    if (a.metric != b.metric) { 
     return(b.metric - a.metric); 
    } 
    // when metrics are the same, sort by key as secondary sort 
    return(b.key - a.key) 
}); 

をまたは:あなたの例のアレイでは、あなたはキーによってそれらが同一であった場合、メトリックによって最初にソートします。このようなカスタムソート関数を使用することができます要素は、その後、あなたはあなたの前にソート順序の値を毎回追加するには、クイックパスが必要になります。

// mark each value with it's current position in the array 
for (var i = 0; i < myArray.length; i++) { 
    myArray[i].sortIndexForTies = i; 
} 
myArray.sort(function(a, b){ 
    if (a.metric != b.metric) { 
     return(b.metric - a.metric); 
    } 
    // when metrics are the same, sort by the original array position as second sort key 
    return(b.sortIndexForTies - a.sortIndexForTies) 
}); 
0

私は私が気に精度の外にソートされたパラメータにデルタを追加することにより、ソートにバイアスをかける素敵な回避策を見つけましたそのパラメータに偏りは、配列を同じ順序にとどめる傾向にします。距離に1つの単位の差がある場合(精度は1sの場所にあります)、その要素は適切にソートされます。

for(var i = 0, len = myArray.length, delta = 0; i < len; i++, delta += 0.000001) 
{ 
    myArray[ i ].metric -= delta; 
} 

function byMetric(a, b) 
{ 
    return b.metric - a.metric; 
} 

myArray.sort(byMetric); 
関連する問題