2017-11-10 14 views
0

ChromeのArray.sort()機能を安定させようとしています。私は安定した並べ替えを実装する他のライブラリがあることを知っていますが、私はアニメーションをトリガーするsort()関数を聞いていくつかの他のライブラリを使用しているので、ネイティブArray.sort()が安定するようにしようとしていますが、安定している。Chromeの安定したソート機能

myArray.sort(function (a, b) { 
    if (a.someVal > b.someVal) return -1 
    else if (a.someVal < b.someVal) return 1 
    //return 0 I shouldn't return 0 as its order will be randomise by chrome 

    // My hack around idea was to somehow track their index but this is not working, probably while sorting is ongoing, looking up the index gets messed up? IDK. 
    let aIndex = myArray.findIndex(x => x.id === a.id) 
    let bIndex = myArray.findIndex(x => x.id === b.id) 
    return aIndex < bIndex ? -1 : 1 
    }) 

誰でもどのようにしてクロムのソート機能を安定させることができますか?

例、並べ替えはbで行います。 安定ソート

[ 
{'a':7,'b':2}, 
{'a':1,'b':1}, 
{'a':2,'b':1}, 
{'a':3,'b':1}, 
{'a':4,'b':1}, 
{'a':5,'b':1}, 
{'a':6,'b':1} 
] 

Chromeの不安定ソート期待

[ 
{'a':1,'b':1}, 
{'a':2,'b':1}, 
{'a':3,'b':1}, 
{'a':4,'b':1}, 
{'a':5,'b':1}, 
{'a':6,'b':1}, 
{'a':7,'b':2}, 
] 

考える

[ 
{'a':7,'b':2}, 
{'a':4,'b':1}, 
{'a':3,'b':1}, 
{'a':2,'b':1}, 
{'a':1,'b':1}, 
{'a':6,'b':1}, 
{'a':5,'b':1} 
] 
+1

可能な複製(https://stackoverflow.com/questions/1427608/fast-stable-sorting-algorithm -implementation-in-javascript) – sapics

+0

要素が等しい場合、0を返すことは重要です。 –

+0

@ JonasW。 0を返すと、注文の運命はブラウザに残りますが、Chromeの場合のように安定していない可能性があります。 –

答えて

1

最初のインデックスが含まれて配列取得:

const withIndexes = myArray.map(
    (x, i) => ({index: i, value: x})); 

SORする関数を作るに多重比較のT:

const compareAll = (...comparisons) => (a, b) => 
    comparisons.reduce((m, f) => m || f(a, b), 0); 

が同様</>でいくつかの値を比較するために、別の関数をすることができる

const compareDefault = (a, b) => 
    a < b ? -1 : 
    a > b ? 1 : 
    0; 

値でソートし、インデックスによって:

withIndexes.sort(compareAll(
    (a, b) => -compareDefault(a.value.someVal, b.value.someVal), 
    (a, b) => compareDefault(a.index, b.index), 
)); 

取得再び値だけ:

const sorted = withIndexes.map(x => x.value); 
0あなたの例では

:[JavaScriptでの高速安定ソートアルゴリズムの実装]の

const compareAll = (...comparisons) => (a, b) => 
 
    comparisons.reduce((m, f) => m || f(a, b), 0); 
 

 
const compareDefault = (a, b) => 
 
    a < b ? -1 : 
 
    a > b ? 1 : 
 
    0; 
 

 
const myArray = [ 
 
    {'a':1,'b':1}, 
 
    {'a':2,'b':1}, 
 
    {'a':3,'b':1}, 
 
    {'a':4,'b':1}, 
 
    {'a':5,'b':1}, 
 
    {'a':6,'b':1}, 
 
    {'a':7,'b':2}, 
 
]; 
 

 
const withIndexes = myArray.map(
 
    (x, i) => ({index: i, value: x})); 
 

 
withIndexes.sort(compareAll(
 
    (a, b) => -compareDefault(a.value.b, b.value.b), 
 
    (a, b) => compareDefault(a.index, b.index), 
 
)); 
 

 
const sorted = withIndexes.map(x => x.value); 
 

 
console.log(sorted);

+0

これは私がやったことでした。並べ替えが行われている間にインデックスを見つける動作は、おそらく定義されていないと考えられます。あなたがしたように事前に指標を準備するだけです。 –

関連する問題