{"id":79860,"date":"2024-03-23T11:33:55","date_gmt":"2024-03-23T02:33:55","guid":{"rendered":"https://freelance.indieverse.co.jp/media/?p=79860"},"modified":"2025-11-01T16:34:57","modified_gmt":"2025-11-01T07:34:57","slug":"ruby-map","status":"publish","type":"post","link":"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-map","title":{"rendered":"【Ruby】mapメソッドの使い方は？eachとの違いや発展的な使い方について現役エンジニアが解説"},"content":{"rendered":"<p>この記事では、</p>\n<ul>\n<li>RubyでのArray操作をもっと効率的に行いたい</li>\n<li>シンプルで簡潔なコードを書いてみたい</li>\n<li>eachメソッドとmapメソッドの違いを明確に理解したい</li>\n</ul>\n<p>という悩みを抱えている向けに、</p>\n<ul>\n<li>mapメソッドの基本情報と使い方</li>\n<li>mapメソッドの応用的な使い方と例</li>\n<li>mapメソッドとeachメソッドの比較</li>\n</ul>\n<p>についてRailsエンジニアである私が解説していきたいと思います。</p>\n<p>Rubyに関して言うと、mapメソッドはほぼマストで使えた方がよいメソッドになるので、ぜひ使えるようになりましょう。<strong>特にeachで冗長に書かざるを得ない状態で、mapはかなり綺麗にかけるのでおすすめです。</strong></p>\n<p><strong>著者：</strong></p>\n\n\t<div class='balloon5'>\n\t\t<div class='faceicon'>\n\t\t\t<img src='https://pbs.twimg.com/profile_images/1230103371664613376/PHLMWlPU_400x400.jpg'>\n\t\t\t<div style='text-align:center'>DAI</div>\n\t\t</div>\n\t\t<div class='chatting'>\n\t\t\t<div class='says'>\n<a href=\"https://www.worksap.co.jp/\">株式会社ワークスアプリケーションズ</a>にてQAエンジニア→<a href=\"https://aidemy.co.jp/\">株式会社Aidemy</a>にてAIプログラミングスクールのマーケティングを担当→キャリアコーチングサービスのパイオニアである<a href=\"https://www.posiwill.co.jp/\">ポジウィル株式会社</a>にCMO就任→<a href=\"https://indieverse.jp/\">株式会社インディバース</a>を創業。<br />\nIT系キャリアに関して情報発信している<a href=\"https://freelance.indieverse.co.jp/media/\">DAINOTE</a>を運営。自身も自社プロダクトである<a href=\"https://media-analytics.jp/\">Media Analytics</a>の開発をRuby on Railsで行うWebエンジニアである。本業はWebマーケター。最近は生成AI系の開発にどハマり中。著書は<a href=\"https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E6%B2%B3%E5%90%88-%E5%A4%A7/dp/4046040076\">独学プログラマーのためのAIアプリ開発がわかる本 </a>。詳細は<a href=\"https://freelance.indieverse.co.jp/media/company\">運営者情報</a>をご覧ください。<br />\n</div>\n\t\t</div>\n\t</div>\n\t\n<h2 id=\"map-\">mapメソッド：要素に対してiterationを実行して、配列で返すメソッド</h2>\n<p>Rubyでは、配列(Array)やハッシュ(Hash)の各要素に対して一定の処理を行い、その結果を新たな配列として返す方法として<code>map</code>メソッドがよく使用されます。<code>map</code>メソッドは、配列の各要素に対してブロック内の処理を適用した結果を集めて、新しい配列を作ります。このメソッドは非常に便利で、Rubyで配列やハッシュを扱う際には頻繁に用いられるメソッドの一つです。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\"><span class=\"hljs-attr\">numbers</span> = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\n<span class=\"hljs-attr\">squared_numbers</span> = numbers.<span class=\"hljs-built_in\">map</span> { |number| number ** <span class=\"hljs-number\">2</span> }\r\nputs squared_numbers\r\n<span class=\"hljs-comment\"># 結果: [1, 4, 9, 16, 25]</span></code></code></pre>\n</div>\n<p><code>map</code>メソッドは、コードを簡潔に書けるだけでなく、コードの意図が明確になり読みやすくなる利点があります。</p>\n<h2 id=\"map-\">mapメソッドの基本的な使い方</h2>\n<p><code>map</code>メソッドを用いる基本的な形式は、配列やハッシュに対して<code>.map</code>を呼び出し、その後ろにブロック（<code>{}</code>）を記述します。このブロック内で、各要素に対する処理を記述します。最終的に、このブロックの処理結果を元にした新しい配列が返されます。</p>\n<p>例えば、次のコードでは、各要素の2倍を計算して新しい配列を作る例を示しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\"><span class=\"hljs-attr\">numbers</span> = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\n<span class=\"hljs-attr\">doubled_numbers</span> = numbers.<span class=\"hljs-built_in\">map</span> { |number| number * <span class=\"hljs-number\">2</span> }\r\nputs doubled_numbers\r\n<span class=\"hljs-comment\"># 結果: [2, 4, 6, 8, 10]</span></code></code></pre>\n</div>\n\n\t<div class='balloon5'>\n\t\t<div class='faceicon'>\n\t\t\t<img src='https://pbs.twimg.com/profile_images/1230103371664613376/PHLMWlPU_400x400.jpg'>\n\t\t\t<div style='text-align:center'>DAI</div>\n\t\t</div>\n\t\t<div class='chatting'>\n\t\t\t<div class='says'>もちろん、ブロックではなく、<code>each do</code> でも同じように書くこともできますよ！</div>\n\t\t</div>\n\t</div>\n\t\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><span class=\"hljs-attr\" style=\"color: inherit;\">numbers</span><span style=\"background-color: inherit; color: inherit;\"> = [</span><span class=\"hljs-number\" style=\"color: inherit;\">1</span><span style=\"background-color: inherit; color: inherit;\">, </span><span class=\"hljs-number\" style=\"color: inherit;\">2</span><span style=\"background-color: inherit; color: inherit;\">, </span><span class=\"hljs-number\" style=\"color: inherit;\">3</span><span style=\"background-color: inherit; color: inherit;\">, </span><span class=\"hljs-number\" style=\"color: inherit;\">4</span><span style=\"background-color: inherit; color: inherit;\">, </span><span class=\"hljs-number\" style=\"color: inherit;\">5</span><span style=\"background-color: inherit; color: inherit;\">]</span><code class=\"lang-ruby\"><span class=\"hljs-attr\">doubled_numbers</span> = numbers.<span class=\"hljs-built_in\">each do </span>|number| \r\n   number * <span class=\"hljs-number\">2</span> \r\nend\r\nputs doubled_numbers\r\n<span class=\"hljs-comment\"># 結果: [2, 4, 6, 8, 10]</span></code></code></pre>\n</div>\n<h2 id=\"each-map-\">mapメソッドが便利な場面：eachメソッドで配列に追加する処理を簡単に書ける</h2>\n<p><strong>mapメソッドは、繰り返し処理をした結果を配列で受け取りたい時に便利です。</strong></p>\n<p><code>each</code>メソッドも配列の各要素に対して処理を行いますが、<code>each</code>は各要素に対する処理の結果を集めて新しい配列を返すことはありません。</p>\n<p>代わりに、もとの配列自体を変更せずに、単に各要素に対して指定したブロックの処理を実行します。</p>\n<p>そのため、新しい配列を作成したい場合は<code>map</code>メソッドの使用が適しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = <span class=\"hljs-string\">[1, 2, 3, 4, 5]</span>\r\ndoubled_numbers = <span class=\"hljs-string\">[]</span>\r\nnumbers.each { |number| doubled_numbers &lt;&lt; number * <span class=\"hljs-number\">2</span> }\r\nputs doubled_numbers\r\n# 結果: <span class=\"hljs-string\">[2, 4, 6, 8, 10]</span></code></code></pre>\n</div>\n<p>上記の<code>each</code>メソッドの例でも同じ結果が得られますが、<code>map</code>メソッドを使う方がよりシンプルで直接的です。</p>\n<p>関連：<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-each\"><span>【Ruby】eachメソッドの使い方の基礎から応用まで現役エンジニアが解説します</span></a></p>\n<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-each\" target=\"_blank\" class=\"related-article-container\">\n\t\t\t\t\t<span class=\"related-article__label\">合わせて読みたい</span>\n\t\t\t\t\t<div class=\"related-article__image\" style=\"background-image:url(https://freelance.indieverse.co.jp/media/wp-content/uploads/2024/03/AdobeStock_416662619-150x150.jpeg)\"></div>\n\t\t\t\t\t<div class=\"related-article__content\">\n\t\t\t\t\t\t<div class=\"related-article__title\">【Ruby】eachメソッドの使い方の基礎から応用まで現役エンジニアが解説します</div>\n\t\t\t\t\t\t<div class=\"related-article__description\">Rubyのeachメソッドの基礎から応用までを現役エンジニアが解説。配列・範囲・ハッ...</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n<h2 id=\"collect-\">mapメソッドとcollectメソッドの関係: mapメソッドのエイリアス（同名です）</h2>\n<p><code>collect</code>メソッドは、Rubyで<code>map</code>メソッドと同じ役割を果たします。</p>\n<p>実は、<code>collect</code>と<code>map</code>は互換性があり、どちらも配列の各要素に対してブロック内の処理を適用し、その結果を新しい配列として返します。</p>\n<p>この2つのメソッドは内部的には同じ動作をするため、使用するメソッドは好みやプロジェクト内のコーディング規約に依存します。</p>\n<p>例えば以下のコードでは、<code>map</code>メソッドと<code>collect</code>メソッドが同じ結果を返すことを示しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\n\r\nsquared_numbers_map = numbers.map { |<span class=\"hljs-built_in\">number</span>| <span class=\"hljs-built_in\">number</span> ** <span class=\"hljs-number\">2</span> }\r\nputs squared_numbers_map\r\n<span class=\"hljs-comment\"># 結果: [1, 4, 9, 16, 25]</span>\r\n\r\nsquared_numbers_collect = numbers.collect { |<span class=\"hljs-built_in\">number</span>| <span class=\"hljs-built_in\">number</span> ** <span class=\"hljs-number\">2</span> }\r\nputs squared_numbers_collect\r\n<span class=\"hljs-comment\"># 結果: [1, 4, 9, 16, 25]</span></code></code></pre>\n</div>\n<h2 id=\"map-\">mapメソッドの省略した書き方：symbol.to_procを使った省略形</h2>\n<p>Rubyでは、ブロックを使うメソッドに対して省略した記述法がよく用いられます。</p>\n<p>特に、<code>map</code>メソッドを使用する際には、この省略形が便利です。省略形を使うと、コードがさらに簡潔になり、読みやすくなります。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\n# ブロックを使わずに:symbol.to_procを使った省略形\r\nsquared_numbers = numbers.<span class=\"hljs-built_in\">map</span>(&amp;:to_s)\r\n<span class=\"hljs-built_in\">puts</span> squared_numbers\r\n# 結果: [<span class=\"hljs-string\">\"1\"</span>, <span class=\"hljs-string\">\"2\"</span>, <span class=\"hljs-string\">\"3\"</span>, <span class=\"hljs-string\">\"4\"</span>, <span class=\"hljs-string\">\"5\"</span>]</code></code></pre>\n</div>\n<p>上記のコードでは、<code>to_s</code>メソッドが各要素に対して呼び出され、数字を文字列に変換しています。</p>\n<p>この省略形は、メソッド呼び出しが各要素に対して単一で、引数が不要な場合に特に有効です。</p>\n<h2 id=\"hash-map-\">Hashでmapメソッドを使う方法</h2>\n<p><code>map</code>メソッドは、配列だけでなくハッシュに対しても使用することができます。</p>\n<p>ハッシュを使用する場合、ブロック変数はキーと値のペアとして取り扱われます。</p>\n\n\t<div class='balloon5'>\n\t\t<div class='faceicon'>\n\t\t\t<img src='https://pbs.twimg.com/profile_images/1230103371664613376/PHLMWlPU_400x400.jpg'>\n\t\t\t<div style='text-align:center'>DAI</div>\n\t\t</div>\n\t\t<div class='chatting'>\n\t\t\t<div class='says'>下記のkeyでは、countryがkey, capitalがvalueとして繰り返し処理がされています</div>\n\t\t</div>\n\t</div>\n\t\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">capitals = { japan: <span class=\"hljs-string\">'Tokyo'</span>, france: <span class=\"hljs-string\">'Paris'</span>, italy: <span class=\"hljs-string\">'Rome'</span> }\r\n# キーを大文字に変換する\r\nupcased_capitals = capitals.map { |country, capital| [country.to_s.upcase, capital] }.to_h\r\nputs upcased_capitals\r\n# 結果: {<span class=\"hljs-string\">\"JAPAN\"</span>=&gt;<span class=\"hljs-string\">\"Tokyo\"</span>, <span class=\"hljs-string\">\"FRANCE\"</span>=&gt;<span class=\"hljs-string\">\"Paris\"</span>, <span class=\"hljs-string\">\"ITALY\"</span>=&gt;<span class=\"hljs-string\">\"Rome\"</span>}</code></code></pre>\n</div>\n<p>このコードでは、ハッシュの各要素（国とその首都）に対して処理を行い、国名を大文字に変換しています。</p>\n<p>最後に<code>to_h</code>メソッドを用いて、配列の配列をハッシュに変換しています。</p>\n<h2 id=\"map-map-\">mapメソッドとmap!メソッドの違いは？</h2>\n<p><code>map</code>メソッドには破壊的なバリエーションである<code>map!</code>メソッドも存在します。</p>\n<p><code>map!</code>メソッドは、元の配列自体を変更して、新しい値で更新します。これに対し、<code>map</code>メソッドは元の配列を変更せず、新しい配列を作成します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\nnumbers.map! { |<span class=\"hljs-built_in\">number</span>| <span class=\"hljs-built_in\">number</span> ** <span class=\"hljs-number\">2</span> }\r\nputs numbers\r\n<span class=\"hljs-comment\"># 結果: [1, 4, 9, 16, 25]</span></code></code></pre>\n</div>\n<p><code>map!</code>メソッドを使用する際には、元の配列が変更されることを意識する必要があります。状況に応じて、<code>map</code>メソッドと<code>map!</code>メソッドを適切に選択してください。</p>\n<h2>インデックス付きで操作するmap.with_indexメソッドの活用</h2>\n<p><code>map.with_index</code>メソッドを使用すると、ブロック内で各要素のインデックスも扱うことができます。これにより、要素自体だけでなくその位置情報を利用した処理が可能になります。<code><br />\n</code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># map.with_indexメソッドの使用例:\r\nfruits = ['apple', 'banana', 'cherry']\r\ncapitalized_fruits_with_index = fruits.map.with_index { |fruit, index| [index, fruit.capitalize] }.to_h\r\nputs capitalized_fruits_with_index.inspect</code></pre>\n</div>\n<p><code> </code></p>\n<p>出力結果:<code><br />\n</code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>{0=&gt;\"Apple\", 1=&gt;\"Banana\", 2=&gt;\"Cherry\"}</code></pre>\n</div>\n<p><code> </code></p>\n<p>この例では、<code>map.with_index</code>を使用して各要素を大文字に変換し、そのインデックスとともに新しいハッシュを生成しています。<code>map.with_index</code>を使うことで、位置情報を保持しながら配列の各要素を加工する処理を容易に実現できます。</p>\n<h2>map後にnilを取り除く: compact</h2>\n<p>配列の変換処理の結果、<code>nil</code>が含まれる場合があります。そういった場合には、<code>compact</code>メソッドをチェーンさせることで<code>nil</code>を簡単に取り除くことができます。</p>\n<p><code></code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [1, 2, nil, 4, 5]\r\nnon_nil_numbers = numbers.map { |n| n ? n * 2 : nil }.compact\r\np non_nil_numbers</code></pre>\n</div>\n<p><code> </code></p>\n<p>実行結果：</p>\n<p><code> </code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[2, 4, 8, 10]</code></pre>\n</div>\n<p><code> </code></p>\n<h2>map後に多次元配列を一次元配列にする: flatten</h2>\n<p><code>map</code>の結果得られた配列がネストしている場合、<code>flatten</code>メソッドを使って平坦化（多次元配列を一次元配列に変換）することができます。</p>\n<p><code></code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>nested_arrays = [[1, 2], [3, 4], [5, 6]]\r\nflattened_and_doubled = nested_arrays.map { |array| array.map { |n| n * 2 }}.flatten\r\np flattened_and_doubled</code></pre>\n</div>\n<p><code> </code></p>\n<p>実行結果：</p>\n<p><code> </code></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[2, 4, 6, 8, 10, 12]</code></pre>\n</div>\n<p><code> </code></p>\n<h2 id=\"map-\">mapメソッドを使ってみよう!</h2>\n<p>Rubyの<code>map</code>メソッドを使用することで、配列やハッシュの各要素に対して一括で処理を実行し、その結果を新たな配列として得ることができます。この機能は、データの変換や加工を効率的に行いたい場合に非常に便利です。</p>\n<p>例えば、次のコードでは、配列内の各数値を文字列に変換しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\nstring_numbers = numbers.map { |<span class=\"hljs-built_in\">number</span>| <span class=\"hljs-built_in\">number</span>.to_s }\r\nputs string_numbers\r\n<span class=\"hljs-meta\"># 結果: [<span class=\"hljs-string\">\"1\"</span>, <span class=\"hljs-string\">\"2\"</span>, <span class=\"hljs-string\">\"3\"</span>, <span class=\"hljs-string\">\"4\"</span>, <span class=\"hljs-string\">\"5\"</span>]</span></code></code></pre>\n</div>\n<p>このように、<code>map</code>メソッドを使用すると、配列の各要素を効率的に操作することが可能です。複雑な処理も、ブロック内に記述することで簡単に表現できます。</p>\n<h3 id=\"-\">実践練習：具体的に処理を見てみる</h3>\n<p><code>map</code>メソッドは、単にデータ型を変換するだけでなく、より具体的な処理を行うこともできます。たとえば、次のコードでは、配列の各要素に3を加えた新しい配列を作成しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\"><span class=\"hljs-attr\">numbers</span> = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\n<span class=\"hljs-attr\">added_numbers</span> = numbers.<span class=\"hljs-built_in\">map</span> { |number| number + <span class=\"hljs-number\">3</span> }\r\nputs added_numbers\r\n<span class=\"hljs-comment\"># 結果: [4, 5, 6, 7, 8]</span></code></code></pre>\n</div>\n<p>この例のように、<code>map</code>メソッドを使えば、配列の各要素に対して一定の加算処理を行い、その結果を新しい配列として返すことができます。同様にして、他の算術演算や条件式を用いた複雑な操作も実現可能です。</p>\n<h3 id=\"-\">実践練習：戻り値を使用する</h3>\n<p><code>map</code>メソッドの大きな特徴は、ブロックの最後に評価された式の結果が新しい配列の要素として追加されることです。この戻り値を活用することで、さまざまなデータ変換を効率的に行うことができます。</p>\n<p>次の例では、配列の各要素が偶数であればそのまま、奇数であれば2を乗じた値を新しい配列として返しています。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\nprocessed_numbers = numbers.map do |<span class=\"hljs-built_in\">number</span>|\r\n  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">number</span>.even?\r\n    <span class=\"hljs-built_in\">number</span>\r\n  <span class=\"hljs-keyword\">else</span>\r\n    <span class=\"hljs-built_in\">number</span> * <span class=\"hljs-number\">2</span>\r\n  <span class=\"hljs-keyword\">end</span>\r\n<span class=\"hljs-keyword\">end</span>\r\nputs processed_numbers\r\n<span class=\"hljs-comment\"># 結果: [2, 2, 6, 4, 10]</span></code></code></pre>\n</div>\n<p>このように<code>map</code>メソッドを用いることで、条件分岐を含む複雑なロジックも、配列の各要素に適用し、新たな配列を得ることができます。これにより、コードの可読性と効率性を同時に向上させることが可能になります。</p>\n<h2 id=\"map-\">map!メソッドも使ってみよう!</h2>\n<p><code>map!</code>メソッドを利用することで、配列の各要素に処理を適用し、その結果で元の配列自体を更新することができます。このメソッドは、<code>map</code>メソッドと似ていますが、元の配列の内容を直接変更する点が異なります。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">numbers = [<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>, <span class=\"hljs-number\">3</span>, <span class=\"hljs-number\">4</span>, <span class=\"hljs-number\">5</span>]\r\nnumbers.map! { |<span class=\"hljs-built_in\">number</span>| <span class=\"hljs-built_in\">number</span> ** <span class=\"hljs-number\">2</span> }\r\nputs numbers\r\n<span class=\"hljs-comment\"># 結果: [1, 4, 9, 16, 25]</span></code></code></pre>\n</div>\n<p>この例では、配列<code>numbers</code>の各要素を二乗し、その結果で元の配列<code>numbers</code>を更新しています。これは、データの変換結果を追加の変数や配列に保存する必要がない場合に有用です。ただし、<code>map!</code>を使用する際には、元の配列が変更されることに注意しましょう。状況に応じて、元のデータを保持する必要がある場合は<code>map</code>メソッドを使用する方が適切です。</p>\n<h2 id=\"hash-\">mapをhashで利用する方法</h2>\n<p>Rubyの<code>map</code>メソッドは、配列だけでなくハッシュに対しても使用することができます。ハッシュの場合、<code>map</code>メソッドはキーと値のペアに対してブロック内の処理を適用し、結果を新しい配列として返します。</p>\n<p>例えば、ハッシュの各値に特定の処理を適用したい場合、次のように<code>map</code>メソッドを使用することができます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code><code class=\"lang-ruby\">capitals = { japan: <span class=\"hljs-symbol\">'Tokyo'</span>, france: <span class=\"hljs-symbol\">'Paris'</span>, italy: <span class=\"hljs-symbol\">'Rome'</span> }\r\nuppercased_capitals = capitals.map { |key, <span class=\"hljs-keyword\">value</span>| [key, <span class=\"hljs-keyword\">value</span>.upcase] }.to_h\r\nputs uppercased_capitals\r\n# 結果: {:japan=&gt;<span class=\"hljs-string\">\"TOKYO\"</span>, :france=&gt;<span class=\"hljs-string\">\"PARIS\"</span>, :italy=&gt;<span class=\"hljs-string\">\"ROME\"</span>}</code></code></pre>\n</div>\n<p>この例では、ハッシュ<code>capitals</code>の各値（都市名）を大文字に変換しています。ブロック内でキーと値のペアを<code>[key, value.upcase]</code>の形式で返し、最後に<code>to_h</code>メソッドを使用して配列の配列をハッシュに変換しています。</p>\n<p>ハッシュの場合、<code>map</code>メソッドはキーと値のペアに対して自由に処理を加えることができるため、データ加工の幅が広がります。これにより、柔軟なデータ処理が可能になります。</p>\n<p>関連：<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-hash\">【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します</a></p>\n<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-hash\" target=\"_blank\" class=\"related-article-container\">\n\t\t\t\t\t<span class=\"related-article__label\">合わせて読みたい</span>\n\t\t\t\t\t<div class=\"related-article__image\" style=\"background-image:url(https://freelance.indieverse.co.jp/media/wp-content/uploads/2022/11/code-g7e399f5d0_1280-150x150.jpg)\"></div>\n\t\t\t\t\t<div class=\"related-article__content\">\n\t\t\t\t\t\t<div class=\"related-article__title\">【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します</div>\n\t\t\t\t\t\t<div class=\"related-article__description\">RubyのHashの使い方を基礎から応用まで解説。配列との違い、追加・更新・削除、key...</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n<h2 id=\"-\">類似メソッドとの違いについて</h2>\n<h3 id=\"select-\">selectとの違い</h3>\n<p><code>select</code>メソッドは、特定の条件に合致する要素のみを抽出するために使用されます。これに対して<code>map</code>メソッドは、配列やハッシュの全ての要素に対して処理を適用し、その結果からなる新しい配列を生成します。つまり、<code>select</code>メソッドはフィルタリングに、<code>map</code>メソッドは各要素の変換に利用されるという違いがあります。</p>\n<p>関連：<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-select\">【Ruby】 selectメソッド完全マニュアル | 基礎から応用・filterとの違いについても解説</a></p>\n<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-select\" target=\"_blank\" class=\"related-article-container\">\n\t\t\t\t\t<span class=\"related-article__label\">合わせて読みたい</span>\n\t\t\t\t\t<div class=\"related-article__image\" style=\"background-image:url(https://freelance.indieverse.co.jp/media/wp-content/uploads/2024/03/28401413_m-150x150.jpg)\"></div>\n\t\t\t\t\t<div class=\"related-article__content\">\n\t\t\t\t\t\t<div class=\"related-article__title\">【Ruby】 selectメソッド完全マニュアル | 基礎から応用・filterとの違いについても解説</div>\n\t\t\t\t\t\t<div class=\"related-article__description\">Rubyのselectメソッドを基礎から解説。配列・ハッシュの絞り込み、select!やwith_i...</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n<h3 id=\"collect-\">collectとの違い</h3>\n<p>前述のとおり、<code>collect</code>メソッドは<code>map</code>メソッドと全く同じ機能を持ち、互換性があります。つまり、<code>collect</code>と<code>map</code>の間に機能的な違いはありません。どちらを使用するかは、個人の好みやプロジェクトのコーディング規約に依存します。</p>\n<h3 id=\"each-\">eachとの違い</h3>\n<p><code>each</code>メソッドも配列やハッシュの各要素に対して処理を実行しますが、<code>each</code>は処理の結果を集めて新しい配列を返すことはしません。<code>each</code>は各要素に対して指定したブロックの処理を実行するだけで、元の配列やハッシュを変更することなく、戻り値として元の配列やハッシュをそのまま返します。<code>map</code>メソッドと異なり、<code>each</code>を使っても新しい配列や変換されたデータを得ることはできません。</p>\n<p>関連：<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-each\"><span>【Ruby】eachメソッドの使い方の基礎から応用まで現役エンジニアが解説します</span></a></p>\n<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-each\" target=\"_blank\" class=\"related-article-container\">\n\t\t\t\t\t<span class=\"related-article__label\">合わせて読みたい</span>\n\t\t\t\t\t<div class=\"related-article__image\" style=\"background-image:url(https://freelance.indieverse.co.jp/media/wp-content/uploads/2024/03/AdobeStock_416662619-150x150.jpeg)\"></div>\n\t\t\t\t\t<div class=\"related-article__content\">\n\t\t\t\t\t\t<div class=\"related-article__title\">【Ruby】eachメソッドの使い方の基礎から応用まで現役エンジニアが解説します</div>\n\t\t\t\t\t\t<div class=\"related-article__description\">Rubyのeachメソッドの基礎から応用までを現役エンジニアが解説。配列・範囲・ハッ...</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n<h2 id=\"-\">他の配列操作メソッドについて</h2>\n<p>Rubyでは、<code>map</code>や<code>select</code>のようなメソッド以外にも、配列を効率的に操作するための様々なメソッドが提供されています。例えば、<code>reduce</code>（または<code>inject</code>）、<code>filter</code>、<code>all?</code>、<code>any?</code>、<code>none?</code>、<code>find</code>など、配列やハッシュのデータを加工・調査するための多くのメソッドがあります。これらのメソッドを学ぶことで、より複雑なデータ処理や条件分岐、集計などを効率的に行うことができるようになります。</p>\n<h2 id=\"-\">まとめ</h2>\n<p>本記事では、Rubyの<code>map</code>メソッドの使い方、応用的な使い方、類似メソッドとの違いについて解説しました。配列やハッシュの各要素に対して処理を行い、その結果を新しい配列やハッシュとして返す<code>map</code>メソッドは、Rubyプログラミングにおいて非常に便利なツールです。このメソッドを使いこなすことで、コードの記述を簡潔にし、プログラムの可読性と効率性を向上させることができます。また、<code>select</code>や<code>each</code>といった他の配列操作メソッドと組み合わせることで、より柔軟なデータ処理を行うことが可能になります。ぜひこの機会に、<code>map</code>メソッドを活用していろいろなコードを書いてみてください。</p>\n","protected":false},"excerpt":{"rendered":"<p>Rubyのmapメソッドの基本の使い方から応用、eachとの違い、配列操作を効率化するcollectエイリアスや&#038;:to_sなど省略形まで現役エンジニアが例付きで解説します。</p>\n","protected":false},"author":1,"featured_media":54424,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[190],"tags":[286],"class_list":["post-79860","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","tag-ruby"],"aioseo_notices":[],"meta_description":"Rubyのmapメソッドの基本の使い方から応用、eachとの違い、配列操作を効率化するcollectエイリアスや&:to_sなど省略形まで現役エンジニアが例付きで解説します。","_links":{"self":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79860","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts"}],"about":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/comments?post=79860"}],"version-history":[{"count":15,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79860/revisions"}],"predecessor-version":[{"id":93454,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79860/revisions/93454"}],"wp:featuredmedia":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media/54424"}],"wp:attachment":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media?parent=79860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/categories?post=79860"},{"taxonomy":"post_tag","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/tags?post=79860"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}