はじめに
配列は要素に別の配列を持つことができるので、
[1,2,3,[4,5,6],7,8,9]
とか
[[1,2,3],[4,5,6],[7,8,9]]
みたいな形の配列を作ることができます。
元々別々の配列を上記のように一つの配列にする場合、配列を結合・追加するメソッドや演算子はたくさんあります。
push<<+concatunshift
ですが、色々使っていたら混乱してきました。
しかも使い方が少しずつ違うようですのでいくつか試してみましたのでこちらにまとめます。
1. pushメソッド
pushメソッドは配列の最後尾に要素の一つとして指定された値を追加します。
a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
a.push(b)
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
b.push(a)
=> [[4, 5, 6], [7, 8, 9], [1, 2, 3]]
b.push(c)
=> [[4, 5, 6], [7, 8, 9], [[10, 11, 12], [13, 14, 15]]]
追加する配列が複数であってもレシーバーの配列の要素一つ分になるようです。
なのでb = [4,5,6],[7,8,9]は[[4,5,6],[7,8,9]]として最後尾に追加されています。
また、pushメソッドは破壊的メソッドです。レシーバーは値が変更されます。
a.push(b)
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
a
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
2. <<演算子
<<演算子はpushメソッドと同じ動作のようです。
a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
a << b
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
b << a
=> [[4, 5, 6], [7, 8, 9], [1, 2, 3]]
b << c
=> [[4, 5, 6], [7, 8, 9], [[10, 11, 12], [13, 14, 15]]]
同じですね!
破壊的メソッドであるという点も同じです。
a << b
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
a
=> [1, 2, 3, [[4, 5, 6], [7, 8, 9]]]
3. + 演算子
+演算子は追加する配列の要素を一つずつ追加します。
a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
d = [-1,-2,-3]
a + b
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b + a
=> [[4, 5, 6], [7, 8, 9], 1, 2, 3]
b + c
=> [[4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
a + d
=> [1, 2, 3, -1, -2, -3]
aの配列では要素は数値一つ一つですので、値が最後尾に追加されていきます。
bの配列では要素は配列一つ一つですので、配列のまま最後尾に追加されていきます。
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
としたい場合には
[a] + b
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
というようにa自体を配列の要素としてあげれば良さそうです。
+演算子は値に変更を加えません。
a + b
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
a
=> [1, 2, 3]
4.concatメソッド
concatメソッドは+演算子とほとんど同じ動作をします。
a = [1,2,3]
b = [4,5,6],[7,8,9]
c = [10,11,12],[13,14,15]
d = [-1,-2,-3]
a.concat(b)
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b.concat(a)
=> [[4, 5, 6], [7, 8, 9], 1, 2, 3]
b.concat(c)
=> [[4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]
a.concat(d)
=> [1, 2, 3, -1, -2, -3]
同じです。
[a].concat(b)
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
配列の要素として扱う方法もこちらでも有効です。
ただし、concatメソッドは破壊的メソッドです。
a.concat(b)
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
a
=> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
ここが+演算子との違いですね。
おまけ.unshiftメソッド
unshiftメソッドはpushメソッドによく似ています。
-
pushメソッドは最後尾に追加します。 -
unshiftメソッドは先頭に追加します。
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
この形を作りたい場合+演算子等でのやり方を載せましたが、unshiftメソッドを使っても実現できます。
a = [1,2,3]
b = [4,5,6],[7,8,9]
b.unshift(a)
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
さいごに
配列を配列のまま結合する方法をまとめた記事を見つけられなかったので、自分でまとめてみました。
間違い等ありましたら教えてください。