Techioz Blog

Rubyのセパレータを使用してハッシュ値内のテキストを新しいハッシュに分割する

概要

私が持っているものと同様の別の質問を見つけましたが、それを再現することはできませんでした(おそらく、ハッシュを扱わず、シンボルも持たないためです)。

したがって、次のようなハッシュ配列があるとします。

[{:id=>1, :name=>"AA;AB;AC", :title=>"A row"},
 {:id=>2, :name=>"BA;BB", :title=>"B row"},
 {:id=>3, :name=>"CA", :title=>"C row"}]

次の結果を達成したいと考えています。

[{:id=>1, :name=>"AA", :title=>"A row"},
 {:id=>1, :name=>"AB", :title=>"A row"},
 {:id=>1, :name=>"AC", :title=>"A row"},
 {:id=>2, :name=>"BA", :title=>"B row"},
 {:id=>2, :name=>"BB", :title=>"B row"},
 {:id=>3, :name=>"CA", :title=>"C row"}]

簡単に言うと、ハッシュをセミコロンで分割して完全に複製したいと考えています。この場合、:name には 1 つ以上のセミコロンを含む 2 つのハッシュがあり、これらを分割して別のハッシュで構成する必要があります。

私の質問を理解していただければ幸いです。ご協力をよろしくお願いいたします。

解決策

ハッシュの配列を反復処理して名前の値を分割し、その結果を現在のハッシュとマージしてマップできます。次に、結果を平坦化できます。

[
  {:id=>1, :name=>"AA;AB;AC", :title=>"A row"},
  {:id=>2, :name=>"BA;BB", :title=>"B row"},
  {:id=>3, :name=>"CA", :title=>"C row"}
].flat_map do |hsh|
  hsh[:name].split(";").map do |name|
    hsh.merge(name: name)
  end
end

# [{:id=>1, :name=>"AA", :title=>"A row"},
#  {:id=>1, :name=>"AB", :title=>"A row"},
#  {:id=>1, :name=>"AC", :title=>"A row"},
#  {:id=>2, :name=>"BA", :title=>"B row"},
#  {:id=>2, :name=>"BB", :title=>"B row"},
#  {:id=>3, :name=>"CA", :title=>"C row"}]