【问题标题】:Split a hash into duplicate hashes based on array data inside the hash Ruby?根据散列Ruby中的数组数据将散列拆分为重复的散列?
【发布时间】:2015-12-15 18:58:27
【问题描述】:

如何从具有数组字段的单个哈希创建两个或多个新哈希:

{carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]}

所以我想要两个像这样的新哈希:

{carStyle: "truck", make: "Ford", model: "Ranger"}
{carStyle: "truck", make: "Toyota", model: "Tacoma"}

我想知道是否有办法使用 map 和 collect 来实现这一点?或者,如果有人看到了类似的问题,他们可以指出我可能错过的问题。

提前致谢!

【问题讨论】:

  • carStyle 总是只有一个值,而makemodel 有相同的数字和相应的顺序,所以第一个品牌与第一个模型一起使用,等等?
  • 两个问题都同意
  • 举个例子时,将所有输入对象分配给变量是有帮助的(例如,h = {carStyle:...})。这样,就可以在 cmets 和 answers 中引用这些变量,而无需定义它们。

标签: ruby-on-rails arrays ruby hash


【解决方案1】:
data = {carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]}
data[:make].zip(data[:model]).map{|x|
  { carStyle: data[:carStyle], make: x[0], model: x[1] }
}

Mark Reed 提出了更好的解决方案:

data[:make].zip(data[:model]).map{|x,y|
  { carStyle: data[:carStyle], make: x, model: y }
}

【讨论】:

  • 我喜欢。您也可以这样做 ...map{ |x,y| { ... make: x, model: y }} 并避免索引。
  • 谢谢@MarkReed,我也会添加你的答案
  • 谢谢你们!这非常有效,让我朝着正确的方向前进
【解决方案2】:
h = {carStyle: "truck", make: ["Ford","Toyota"], model: ["Ranger", "Tacoma"]}

style, makes, models = h.values_at(:carStyle, :make, :model)
  # => ["truck", ["Ford", "Toyota"], ["Ranger", "Tacoma"]] 

makes.zip(models).map {|make, model| {carStyle: style, make: make, model: model}}
  #=> [{:carStyle=>"truck", :make=>"Ford",   :model=>"Ranger"},
  #    {:carStyle=>"truck", :make=>"Toyota", :model=>"Tacoma"}] 

我添加了局部变量以提高可读性。

【讨论】:

  • 为了提高可读性而多写一行代码是值得的。
猜你喜欢
  • 2015-02-03
  • 2011-07-24
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2011-05-01
  • 2012-06-12
  • 1970-01-01
  • 2014-05-19
相关资源
最近更新 更多