つい最近、同僚のコードで非常に魔法の問題が発生しました。一般的なプロセスは、オブジェクトで構成される配列をソートするために使用され、b が優先条件として使用されるというものです。 1 に等しい a の値が何であっても、それが最初に来ます。これは非常に単純な質問ですが、問題は、今回のソートを実装するために、sort を 2 回使用し、最初に a の属性に従ってソートし、次に b の値に従ってソートしていることです。問題は 2 番目の種類にあります。
最初の並べ替えでは、配列が a の属性に従って大きいものから小さいものへと並べ替えられたことは当然のことと考えます。2 回目の並べ替えでは、元の配列 (通常は記述されている) の順序を変更する必要がないだけです。 0 または -1 を返すメソッドでは)、b が 1 に等しい要素を前面に置くことのみを考慮してください。しかし実際には、これは言語によって選択された並べ替えアルゴリズムに関連しており、JavaScript (および他の言語) の組み込みの並べ替えメソッドは複数の並べ替えアルゴリズムのコレクションを使用しており、同じ要素の位置が保証されない場合があります。一貫している。
以下は stackoverflow
から見つかった例です。arrayToSort.sort(function (a, b) {
b.strength - a.strength;
を返します。
});
arrayToSort.forEach(関数 (要素) {
console.log(要素.名);
});
最後の要素の値はまだ a から t であると考えられますが、実際の実行結果は順序が狂っています。これは、ソート アルゴリズムが元の配列の順序を保持しておらず、不安定であるためです。
このような状況が起こらないように最善を尽くす必要があります。私の同僚の例で言えば、2 つのソートのロジックを 1 つにマージすることが可能です。複数のソートに分割する必要がある場合は、マージする必要があります。元の配列のロジック 順序は要素の属性に記録されます。