JavaScriptで配列を非破壊的にsortする

image.png (59.9 kB)

TOC

sort()メソッド

JavaScriptの配列でソート処理をしたいときは、多くの場合sort()メソッドを使用すると思います。

しかしsort()メソッドは、map()メソッドやfilter()メソッドと違い、新たな配列を返すわけでは無いので、元の配列を変更してしまう破壊的なメソッドとなります。

const array = [4, 2, 1, 3]
const array2 = array.sort()

console.log(array2) // [1, 2, 3, 4] 
console.log(array) // [1, 2, 3, 4]  ... 元の配列も変更されてしまう

非破壊的にソートを行う

シチュエーションによっては元の配列を変更せず(非破壊的)に、sort()メソッドを実行したい場合があると思います。 そのような場合は、sort()メソッドを実行する前に、Array.from()メソッドを実行し、元の配列のシャローコピーを生成してから配列に対しソート処理を実行すると、非破壊的にソートを行う事ができます。

const array = [4, 2, 1, 3]
const array2 = Array.from(array).sort() // 配列のコピーを生成後sort()を実行
console.log(array2) // [1, 2, 3, 4] 
console.log(array) // [4, 2, 1, 3]  ... 元の配列は変更されていない

破壊的な配列メソッドを、非破壊的に実行したい全てのシチュエーションで使えるので、覚えておくと役に立つかもしれません。

その他

sort()メソッドの前に配列をコピーすれば良いので、slice()メソッドでも同じ結果を得る事ができます。

const array = [4, 2, 1, 3]
const array2 = array.slice().sort() // slice()後にsort()を実行

console.log(array2) // [1, 2, 3, 4] 
console.log(array) // [4, 2, 1, 3]

Array.from()メソッドは、polyfillなど入れてない場合Internet Explorerには対応していないので、IE対応を行う場合はこちらのslice()メソッドを使用する方法で実装する必要があります。

CONTACT
© 2023, Kakkiii All Rights Reserved.