【Rubyメモ】eachメソッドで複数の配列を同時にループさせる方法

Sponsored Link


Rubyのeachメソッドで複数の配列を回したいんだけど!

どうも、Linです。海鮮丼、仕入れました。

 

「Rubyで配列に入ってる変数を取り出して使いたい・・・!」

そんな時もたまにあるでしょう。

この時に便利なのがRubyのeachメソッドです。たとえば、フルーツに関する次の配列があったとしましょう。

このとき、fruitsの配列の中身を順番に表示させたいときは次のようなコードを書けばいいのですね。

すると、出力結果は次のようになるはず。

apple
banana
grape
orange

このeachメソッドはRails開発でも頻繁に使うもので、配列のインスタンス変数から順番に変数を取り出してビューファイルに表示させるときなんかに活躍します。

 

そんなeachメソッドではなんと、

1つの配列だけじゃなくて複数の配列から同時に変数を取り出せる方法

というものが存在していたのです。

その方法が、

zipメソッド

というやつを使う方法です。

 

具体的に使い方は、

ですね。

たとえば、フルーツと野菜の配列から、同時に野菜とフルーツを取り出して同時に表示させたいときは次のようなコードを書いていきますよ。

このコードの出力結果は次のようになるはずです。

apple
carrot
banana
radish
grape
leaf
orange
letus

 

 

Rails開発でeachメソッドで同時に配列を回す例

このeachのzipメソッドで複数の配列を同時に回すやり方はRails開発でももちろんいきてきます。

ぼくは必要に駆られて、あるウェブサイトから記事タイトルとURLを取り出して、さらにタイトルにリンクをつける、というRailsアプリを作ろうとしていました。

前回作成した「Railsのスクレイピングアプリ」ではタイトルだけスクレイピングしてきましたが、今回はそいつにaタグをつけてリンクまで付与しようとしたわけです。

 

このアプリを実現するためには、どうしても、

  • タイトルの配列
  • URLの配列

の2つを同時にeachで繰り返し展開させる必要があったのです。

ってことで、前回のスクレイピングアプリ(http://freesworder.netからタイトルを取得するアプリ)を改変して、タイトルにリンクをつけていきます。

 

まずは前回のスクレイピングアプリのtop_cotnroller.rbを次のように編集。

ここではページURLを格納するための@urlsというインスタンス変数を新たに定義しています。searchメソッドで「クラス名がentry-titleで、その中にあるaタグ」の情報を取得して代入します。

 

続いて、記事タイトルとリンク先を表示するためのビューファイル(home.html.erb)を次のように編集します。

注目したいのは次の2点。

  1. zipメソッドで複数の配列を同時ループ
  2. get_attributeメソッドでaタグ内の属性値hrefを取得

zipメソッドを使うことで、@elementsと@urlsという2つの配列を同じループで同時に取り出すことができているので、記事タイトルとそれに対応するリンクを同時に紐づけて表示できています。

また、@urlsに代入した「クラス名がentry-titleで、その中にあるaタグ」の情報から「属性値がhref」のものをget_attribution(:href)で取り出して表示しているのです。

 

とまあこんな感じで、eachの繰り返しを複数の配列で同時進行できるzipメソッドはRails開発でも便利なので使ってみてくださいね。

 

それでは!

Lin

 

【参考URL】

 sachin21's blog 
Entry is not found - sachin21's blog
http://sachin21blog.hatenablog.com/entry/2014/03/13/133513
技術ブログ

 

飯橋凛(Ihashi Lin)

インターネット広告代理店を1年半で退職。
その後、副業として活動していたウェブメディア運営のフリーランスへ。
現在はプログラミングの勉強に励み、0からフリーエンジニアの道を目指す。最近はキムチをまとめ買いにはまっている。


Sponsored Link

コメントはこちらからお願いします!



もう1本読んでみる