[Sy] JavaScriptのArrayをソートした結果が欲しいけど、元の配列もそのままキープしたい(非破壊的にソート)
2015/06/26
JavaScriptのArrayにあるsort()
メソッドは破壊的(元の配列自体の並びが変わってしまう)なんですが、非破壊的にsortしたい場合のちょっとしたテクニックです。
まずはふつうにsort()
を使って配列をソートしてみると、
var a = [2, 3, 1];
console.log(a.sort()); // [1, 2, 3] ソートされてる。
console.log(a); // [1, 2, 3] ソートされたまま。(破壊的)
元の配列a
そのものがソートされた状態になります。
元の配列はそのままキープしつつ、ソートした結果を取得したい、という場合は次のようにするとできます。
var a = [2, 3, 1];
var b = a.slice();
console.log(b.sort()); // [1, 2, 3] ソートされてる。
console.log(a); // [2, 3, 1] 元のまま。(非破壊的)
これはslice()
の以下の仕様を利用しています。
- 配列の一部をコピーして、別オブジェクトとして返してくれる。
- オプショナルな引数として、
slice([begin, [end]])
を指定できる。(begin
からend-1
までの要素をコピー) a.slice()
のように引数を省略した場合は、slice(0, a.length)
として処理される。
要するに、a.slice()
とするとa
のすべての要素をコピーした配列が新しく作られて、それが返されます。
その結果、var b = a.slice()
の部分で a
と同じ要素を持つけど参照先が異なる配列がb
として扱えるようになっている ということです。