Syntax Error.

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

参考