在Ruby中使用分隔符将哈希值中的文本拆分为新的哈希值

nhjlsmyf  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(91)

我发现another question与我拥有的类似,但我无法复制它(可能是因为它不处理哈希,也没有符号)。
因此,给定以下哈希数组:

[{: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有两个散列,其中一个或多个散列应该被拆分并包含在另一个散列中。
我希望你能理解我的问题。任何帮助是高度赞赏。

8xiog9wr

8xiog9wr1#

你可以遍历你的哈希数组,拆分它们的name值,然后Map结果,将其与当前哈希合并。然后你可以将结果展平:

[
  {: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"}]
siotufzp

siotufzp2#

使用Enumerable#each_with_object

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

ary.each_with_object([]) do |hash, new_ary|
  hash[:name].split(";").each do |name|
    new_ary << hash.merge(name: name)
  end
end

相关问题