[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として扱えるようになっている ということです。