JavaScript で整数の配列を並べ替える
このチュートリアルでは、配列を特定の順序で並べ替えるために使用できる .sort
メソッドを紹介します。このチュートリアルでは、整数の配列を正しく並べ替える場合に、このメソッドに比較関数が必要な理由を説明します。
この比較関数は、ソート順を指示します。また、.sort
メソッド内の矢印関数として比較関数を利用することにより、降順の並べ替えを行う方法と、すべてを一緒に使用する短い方法について説明します。
JavaScript で .sort
メソッドを使って整数の配列をソートする
.sort
メソッドは、このメソッドが最初に呼び出された配列から順序付けられた配列を返す Array
エンティティのメソッドです。例えば:
// Input
let array = [10, 10000, 1000, 100, 1]
console.log(array.sort())
出力:
// Output
[ 1, 10, 100, 1000, 10000 ]
確かに、これは .sort
メソッドが配列を注文するときに予想されます。しかし、以下の入力がある場合:
// Input
let array = [12900, 877, 12, 992, 10000]
console.log(array.sort())
このような間違った順序があります:
// Output
[10000, 12, 12900, 877, 992]
これは、.sort
のデフォルトの順序が、Unicode パターンのエンコーディングである UTF-16
または 16 ビット単位変換フォーマット
に基づいているために発生します。このメソッドは、配列値を文字列型に変換してから、Unicode 値を並べ替えます。
これを説明すると、.sort
メソッドを使用して、数値だけでなく他のデータ型を並べ替えることもできます。
しかし、.sort
メソッドを使用して配列を正しく並べ替えるにはどうすればよいでしょうか。それは簡単です:比較関数を使用することによって。
比較関数をパラメーターとして渡す
.sort
メソッドはパラメーターなしで使用できるため、比較関数はオプションです。基本的に、この関数は .sort
メソッドの順序を定義し、この関数は 2つのパラメーターを受け取ります。最初の要素を比較し、2 番目の要素を比較します。
.sort
メソッドは次のようになります。
compareFunction
が 0 より大きい値を返す場合は、second
の後にfirst
を置きます。compareFunction
が 0 未満の値を返す場合は、first
をsecond
の前に置きます。compareFunction
が 0 に等しい値を返す場合は、何もしません。
したがって、compareFunction(first, second)
を使用すると、first
パラメーターと second
パラメーターの間で操作を渡すことにより、ソートの順序を指定できます。昇順で、
// Ascending ordering
function compareFunction(first, second) {
if (first > second)
return 1 // 1 is greater than 0, so .sort will put first after second.
if (first < second) return -1 // -1 is less than 0, so .sort will put first
// before second.
return 0
}
また、降順の場合、演算子を逆にすることができます。
// Descending ordering
function compareFunction(first, second) {
if (first < second)
return 1 // 1 is greater than 0, so .sort will put first after second.
if (first > second) return -1 // -1 is less than 0, so .sort will put first
// before second.
return 0
}
ここで、昇順の compareFunction
を .sort
メソッドと一緒に配置すると、最後に次のようになります。
// Input:
let array = [12900, 877, 12, 992, 10000]
// Ascending
array.sort(function compareFunction(first, second) {
if (first > second)
return 1 // 1 is greater than 0, so .sort will put first before second.
if (first < second) return -1 // -1 is less than 0, so .sort will put first
// after second.
return 0
})
console.log(array)
出力:
// Output:
[ 12, 877, 992, 10000, 12900 ]
JavaScript で矢印関数を使って整数の配列をソートする
また、矢印関数を使用して、すべてのコードブロックを最小限の構文に減らすことができます。
矢印関数は、構文が短い関数を使用するもう 1つの方法です。矢印関数は無名関数であり、これは、名前が付けられておらず(変数に格納されるか、関数パラメーターとして渡される)、すべての状況で使用できるわけではないことを意味します。
矢印関数の構造を使用すると、例のように、従来の関数をより短いブロックに変換できます。
// Common anonymous function
function(x) {
return x + 1;
}
// Arrow function
(x) => x + 1
さらに、矢印関数の構造は、予約語 return
なしで式の値を自動的に返すことができます。
// Arrow function
let arrowFunction = (x) => x + 1
console.log(arrowFunction(1))
出力:
//Output
2
console.log()
は、arrowFunction
が return
ステートメントを使用していなくても、1 + 1
の値、つまり 2
を出力します。それは次のステップで私たちを助けます。
前述のように、.sort
メソッドには Compare 関数を含めることができ、この関数は矢印関数にすることができます。以前の CompareFunction 構造を変換すると、次のように、コードのすべてのブロックをより短いブロックに変換できます。
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => {
if (first > second) return 1
return -1
})
// Ascending: If first > second == true, then change one by the other.
console.log(array)
条件を first < second
にドロップし、代わりに、プライマリ条件が当てはまらない場合は、デフォルトとして -1
値を返すことができます。.sort
メソッドの 0
値が等しい値であるとすると、このようにして、最終結果に干渉することなく位置を変更できます。このようにして、以下の例のように、さらに削減することができます。
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first > second ? 1 : -1)
// Ascending: If first > second == true, then change one by the other.
console.log(array)
以前の >
比較とデフォルトの return
が 1つの比較のみに変更されたことを確認してください:first > second ? 1 : -1
。これは、比較が true
の場合、1
を返すことを意味します。そうでない場合は、-1
を返します。
?
が必要です first > second
の比較では true
または false
のみになるため、三項演算子。ただし、前述のように、.sort
メソッドは 1
、-1
、または 0
を想定しています。
出力:
// Output:
[ 1, 10, 100, 1000, 10000 ]
そして降順の場合:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first < second ? 1 : -1)
// Descending: If first < second == true, then change one by the other.
console.log(array)
出力:
// Output:
[ 10000, 1000, 100, 10, 1 ]
同じことを行う別の方法は、減算に -
三項演算子を使用することです。array.sort((first, second) => first > second ? 1 : -1)
を使用する場合、first - second
の値が 0 より大きい場合、インデックスは相互に変化します。first - second
の結果が 0 未満の場合、何も起こりません。値が等しい場合、比較は 0
を返します。
例:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => first - second))
出力:
// Output:
[ 1, 10, 100, 1000, 10000 ]
降順で何ができるでしょうか?いいえ、-
三項演算子を+
に変更していません。しかし、これには簡単な解決策があります。しかし、これには簡単な解決策があります。first - second
を second - first
に反転します。
このように、second - first
の結果が 0 より大きい場合、.sort メソッドは相互に位置を変更します。
例:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => second - first))
出力:
// Output:
[ 10000, 1000, 100, 10, 1 ]