簡體   English   中英

給定一個散列數組,修改每個散列以包含另一個 hash 的鍵值組合

[英]Given an array of hashes modify each one to include a key value combination of another hash

示例 1:

array_of_hashes = [{"name"=>"bob", "age"=>30}, {"name"=>"bart", "age"=>35}]

metadata_hash = {"likes"=>["apples", "oranges"], "dislikes"=>["cold"]}

您將如何獲得此 output:

[{"name"=>"bob", "age"=>30, "likes"=>"apples", "dislikes"=>"cold"},
 {"name"=>"bob", "age"=>30, "likes"=>"oranges", "dislikes"=>"cold"},
 {"name"=>"bart", "age"=>35, "likes"=>"apples", "dislikes"=>"cold"},
 {"name"=>"bart", "age"=>35, "likes"=>"oranges", "dislikes"=>"cold"}]

示例 2:

array_of_hashes = [{"name"=>"bob", "age"=>30}, {"name"=>"bart", "age"=>35}]
metadata_hash = {"likes"=>["apples", "oranges"], "dislikes"=>["cold"], "courses"=>["science", "history"]}

預期 Output:

[{"name"=>"bob", "age"=>30, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"science"},
 {"name"=>"bob", "age"=>30, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"history"},
 {"name"=>"bob", "age"=>30, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"science"}
 {"name"=>"bob", "age"=>30, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"history"},
 {"name"=>"bart", "age"=>35, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"science"},
 {"name"=>"bart", "age"=>35, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"history"},
 {"name"=>"bart", "age"=>35, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"science"}
 {"name"=>"bart", "age"=>35, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"history"}]
arr = [{"name"=>"bob", "age"=>30}, {"name"=>"bart", "age"=>35}]

meta_hash = {"likes"=>["apples", "oranges"], "dislikes"=>["cold"],
             "courses"=>["science", "history"]} 

您可以按如下方式計算所需的結果。

keys = metadata_hash.keys
  #=> ["likes", "dislikes", "courses"]
values = metadata_hash.values
  #=> [["apples", "oranges"], ["cold"], ["science", "history"]]
a = values.shift.product(*values).map { |arr| keys.zip(arr).to_h }
  #=> [{"likes"=>"apples", "dislikes"=>"cold", "courses"=>"science"},
  #    {"likes"=>"apples", "dislikes"=>"cold", "courses"=>"history"},
  #    {"likes"=>"oranges", "dislikes"=>"cold", "courses"=>"science"},
  #    {"likes"=>"oranges", "dislikes"=>"cold", "courses"=>"history"}]
array_of_hashes.flat_map { |h| a.map { |g| h.merge(g) }}
  #=> [{"name"=>"bob", "age"=>30, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"science"},
  #    {"name"=>"bob", "age"=>30, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"history"},
  #    {"name"=>"bob", "age"=>30, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"science"},
  #    {"name"=>"bob", "age"=>30, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"history"},
  #    {"name"=>"bart", "age"=>35, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"science"},
  #    {"name"=>"bart", "age"=>35, "likes"=>"apples", "dislikes"=>"cold", "courses"=>"history"},
  #    {"name"=>"bart", "age"=>35, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"science"},
  #    {"name"=>"bart", "age"=>35, "likes"=>"oranges", "dislikes"=>"cold", "courses"=>"history"}]

計算a的第一步如下。

values.shift.product(*values)
  #=> [["apples", "cold", "science"], ["apples", "cold", "history"],
  #    ["oranges", "cold", "science"], ["oranges", "cold", "history"]]

請參閱Array#productEnumerable#flat_mapHash#merge

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM