• DoRubyとは
  • お問い合わせ
  • Ruby/Rails
  • Web開発
  • Webマーケティング
  • アピリッツ
  • ライフハック
  • ゲーム制作/開発
  • Railsの小技
  • Rubyの小技
  • Gemの紹介
  • ActiveRecord
  • 初心者向け
  • Java/Scalaテク
  • Unixのあれこれ
  • データベース
  • スマホ開発
  • HTML/CSS/JavaScript
  • デザイン製作
  • インフラ
  • クラウド
  • セキュリティ
  • エディタ
  • バージョン管理
  • その他
  • python
  • アクセス解析
  • Googleアナリティクス
  • Googleデータスタジオ
  • Web広告
  • SEO
  • UI/UX
  • ソーシャルメディア
  • EC開発
  • Webシステム開発
  • コンサルティング
  • Webデザイン
  • ブロックチェーン
  • ゲーム紹介
  • アプリ紹介
  • ASP
  • 風景
  • パソコン
  • ツール
  • ガジェット
  • 仕事術
  • 健康
  • 生活
  • 書評
  • Excel(エクセル)
  • PowerPoint(パワーポイント)
  • ゲームプランニング
  • SpriteStudio
  • マスターデータ入力/作成
  • Unity
  • キャラクターデザイン
  • ゲームシナリオ
  • レベルデザイン
  • ゲーム分析
  • 3DCG
  • イラスト制作
  • CG/アニメーション
  1. ホーム
  2. Ruby/Rails
  3. 初心者向け
  4. flattenで多次元を1次元に
  • 2017-10-19
    • カテゴリ:
    • 初心者向け
    • タグ:
    • flatten
    • ruby
    • map
    • Rails

flattenで多次元を1次元に

この記事は公開から1年以上が経過しています。情報が古い可能性がありますのでご注意ください。

今回は、rubyのflattenメソッドの紹介をしていきます。

flattenメソッドとは

flattenは、配列とハッシュに使用することができます。
配列に対してflattenメソッドを使用すると、2次元配列や3次元配列などの階層の深い配列を1次元配列に再構築してくれます。

[ [1, 2], [3, 4], [5, 6] ].flatten
=> [1, 2, 3, 4, 5, 6]

[ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ].flatten
=> [1, 2, 3, 4, 5, 6, 7, 8]

ハッシュに対してflattenメソッドを実行すると、ハッシュのキーと値の一次元配列が返ります。

{ "apple" => 3, "grape" => 2, "peach" => 5 }.flatten
=> ["apple", 3, "grape", 2, "peach", 5]

しかし、ハッシュの値がハッシュである場合は値のハッシュは変換されません。

{ "red" => { "apple" => 3 }, "purple" => { "grape" => 2 } }.flatten
=> ["red", {"apple"=>3}, "purple", {"grape"=>2}]

mapメソッドとの組み合わせて使用する

ここで紹介しているflattenメソッドですが、mapメソッドと組み合わせて使用することで階層の深い関連データを1次元の配列で取得することができます。
例をProject Programmer Workモデルで説明します。目的は、Projectに関係のあるProgrammerのWorkの一覧を取得することです。
enter image description here

以下のコードがProjectに関係のあるProgrammerのWork一覧を取得するコードです。

project = Project.find(1)
project.programmers.map(&:works).flatten

このコードが何をしているのか説明していきます。
まず、project.programmersでprojectに紐づくprogrammerを参照しています。

project.programmers
=> [#<Programmer id: 1, name: "taro">, #<Programmer id: 2, name: "jiro">]

次にproject.programmers.map(&:works)でprogrammerに紐づくworkを参照しています。ただし、2次元配列で返ってきます。

project.programmers.map(&:works)
=> [[#<Work id:1, status: "new">, #<Work id:2, status: "fin">], [#<Work id:3, status: "fin">, #<Work id:4, status: "fin">]]

最後にproject.programmers.map(&:works).flattenで2次元配列を1次元配列に再構築しています。

project.programmers.map(&:works).flatten
=> [#<Work id: 1, status: "new">, #<Work id: 2, status: "fin">, #<Work id: 3, status: "fin">, #<Work id: 4, status: "fin">]

まとめ

eachなどのループを使用すれば、この記事で紹介したように階層の深いデータを取得することができますが、mapとflattenを使用すれば1行で納めることができます。自分の経験上、関連データの関連データを一覧で取得する機会があまりないですが、rubocopで行数を抑えたいときに使えるかと思います。


  • 733 views
    • Tweet
    • このエントリーをはてなブックマークに追加

この記事を書いた人
kodama

「いいね!」するとDoRubyの最新記事を受け取ることができます。

Facebook

Twitterから最新記事を受け取るならこちら

Follow @doruby

Feedlyから最新記事を受け取るならこちら

follow us in feedly

おすすめの記事
  • 695 views
  • 2015-10-01
RailsのViewを自在にカスタマイズするための「Cosme」gem
  • 907 views
  • 2016-07-31
carrierwaveとfogでRiak CSへの画像アップロードを実装する

カテゴリ

Ruby/RailsRailsの小技Rubyの小技Gemの紹介ActiveRecord初心者向けWeb開発Java/ScalaテクUnixのあれこれデータベーススマホ開発HTML/CSS/JavaScriptデザイン製作インフラクラウドセキュリティエディタバージョン管理その他pythonWebマーケティングアクセス解析GoogleアナリティクスGoogleデータスタジオWeb広告SEOUI/UXソーシャルメディアアピリッツEC開発Webシステム開発コンサルティングWebデザインブロックチェーンゲーム紹介アプリ紹介ASP風景ライフハックパソコンツールガジェット仕事術健康生活書評Excel(エクセル)PowerPoint(パワーポイント)ゲーム制作/開発ゲームプランニングSpriteStudioマスターデータ入力/作成Unityキャラクターデザインゲームシナリオレベルデザインゲーム分析3DCGイラスト制作CG/アニメーション

    人気の記事
    最近の記事
    • 4,037 views
    • 2020-04-02
    Kali Linux 2020.2 導入と日本語化
    • 924 views
    • 2020-03-06
    rack-lineprofを改造して管理画面からファイル指定&ログ追跡出来るように
    • 898 views
    • 2020-03-05
    FactoryBot と Gimei を使って架空のユーザを作る
    • 614 views
    • 2020-02-04
    ActionCable実装しようwith webpack
    • 540 views
    • 2020-01-27
    この頃のプルリクに対するレビュー
    Facebook

      サイト情報
      • DoRubyとは
      • 株式会社アピリッツ

      ソーシャルアカウント
      • Facebook
      • Twitter

      企業情報
      • 会社概要
      • 採用情報
      • お問い合わせ
      サービス製品
      • レコメンドASP
      • サイト内検索ASP「Advantage Search」
      • オープンソースECサイト構築パッケージ「エレコマ」
      • 受注・在庫・商品情報一元管理「モールコネクター」
      • セキュリティ診断サービス
      • Googleアナリティクスセミナー

      Copyright © Appirits All Rights Reserved.