【Ruby】複数の配列を1つの配列に結合するメソッドまとめ

Ruby

concatメソッド

concatは配列を自身の末尾に破壊的に連結するメソッドです。

concatを利用した配列の結合は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> [].concat(array1, array2, array3)
=> ["a", "b", "c", "d", "e", "f"]

concatはレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> array1.concat(array2, array3)
=> ["a", "b", "c", "d", "e", "f"]

### array1の内容が変わってしまう
> array1
=> ["a", "b", "c", "d", "e", "f"]

append(push)メソッド

appendは配列の末尾に要素を追加するメソッドです。pushappendと等価なメソッドです。

appendを利用した配列の結合結果は多次元配列になります。ですので、1次元配列で結果を取得する場合はflattenを利用するか、引数の配列にアスタリスク(*)を付け足します。

appendを利用した配列の結合は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

### 多次元配列を1次元配列にする
> [].append(array1, array2, array3).flatten
=> ["a", "b", "c", "d", "e", "f"]

### 配列の要素を展開する
> [].append(*array1, *array2, *array3)
=> ["a", "b", "c", "d", "e", "f"]

### 参考: 配列をそのまま引数にすると多次元配列になる
> [].append(array1, array2, array3)
=> [["a", "b"], ["c", "d"], ["e", "f"]]

appendメソッドはレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> array1.append(*array2, *array3)
=> ["a", "b", "c", "d", "e", "f"]

### array1の内容が変わってしまう
> array1
=> ["a", "b", "c", "d", "e", "f"]

+メソッド

+は配列を連結するメソッドです。

+を利用した配列の結合は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> array1 + array2 + array3
=> ["a", "b", "c", "d", "e", "f"]

<<メソッド

<<は列の末尾に要素を追加するメソッドです。

<<を利用した配列の結合結果は多次元配列になるため、1次元配列で結果を取得する場合はflattenを利用します。また、<<の引数は1つしか指定できないため引数が複数になる場合は<<を連結させます。

<<を利用した配列の結合は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

### 多次元配列を1次元配列にする
> ([] << array1 << array2 << array3).flatten
=> ["a", "b", "c", "d", "e", "f"]

### 参考: 配列をそのまま引数にすると多次元配列になる
> [] << array1 << array2 << array3
=> [["a", "b"], ["c", "d"], ["e", "f"]]

<<メソッドはレシーバに対して破壊的な変更を加えます。ですので、以下のようにすると連結元の配列が変更される(今回の例でいうとarray1)ので注意してください。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> array1 << array2 << array3
=> ["a", "b", ["c", "d"], ["e", "f"]]

### array1の内容が変わってしまう
> array1
=> ["a", "b", ["c", "d"], ["e", "f"]]

参考: inject(reduce)メソッド

配列の結合はたたみこみ演算をするinjectメソッドでも表現できます。reduceinjectと等価なメソッドです。

injectを利用して配列にconcatを実施する例は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> [array1, array2, array3].inject([], :concat)
=> ["a", "b", "c", "d", "e", "f"]

injectを利用して配列に+を実施する例は以下の通りです。

> array1 = ['a', 'b']
> array2 = ['c', 'd']
> array3 = ['e', 'f']

> [array1, array2, array3].inject(:+)
=> ["a", "b", "c", "d", "e", "f"]

まとめ

メソッド レシーバに破壊的変更を加えない 配列の結合結果が1次元 引数の複数指定
concat x
append(push) x x
+
<< x x x

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考記事