使用数组值更新Ruby哈希值

时间:2017-03-31 23:45:14

标签: ruby-on-rails arrays ruby hash

我创建了以下哈希键,其值从PDF解析为数组:

columns = ["Sen", "P-Hire#", "Emp#", "DOH", "Last", "First"]
h = Hash[columns.map.with_index.to_h]
=> {"Sen"=>0, "P-Hire#"=>1, "Emp#"=>2, "DOH"=>3, "Last"=>4, "First"=>5}

现在我想用另一个解析数据数组中的6个等效值更新每个键的值:

rows = list.text.scan(/^.+/)
row = rows[0].tr(',', '')
@data = row.split
=> ["2", "6", "239", "05/05/67", "Harp", "Erin"]

我可以在视图中迭代@data,它将列出6个值中的每一个。当我尝试在控制器中执行相同操作时,它为每个键设置相同的值:

data.each do |e|
  h.update(h){|key,v1| (e) }
end
=>
{"Sen"=>"Harper", "P-Hire#"=>"Harper", "Emp#"=>"Harper", "DOH"=>"Harper", "Last"=>"Harper", "First"=>"Harper"

所以它将每个键的值设置为循环数组的最后一个值...

2 个答案:

答案 0 :(得分:3)

我会这样做:

h.keys.zip(@data).to_h

如果h的唯一目的是作为获得结果的临时步骤,您可以免除它并执行:

columns.zip(@data).to_h

答案 1 :(得分:1)

有几种方法可以解决这个问题,但更直接,更直接的方法是:

columns = ["Sen", "P-Hire#", "Emp#", "DOH", "Last", "First"]
...
@data = row.split

h = Hash.new
columns.each_with_index do |column, index|
 h[column] = @data[index]
end

另一种方式:

h.each do |key, index|
  h[key] = @data[index]
end

就像我说的,有几种方法可以解决这个问题,最好的方法总是取决于你想要达到的目标。