通过数组初始化哈希值

时间:2015-03-14 06:37:08

标签: ruby arrays hash

我们有一个哈希和一个数组:

hsh = {name: "", age: "", height: "", weight: ""}
arr  = ["joe", "19", "179", "70"]
我们想要:

hsh = {name: "joe", age: "19", height: "179", weight: "70"}

我的解决方案工作正常:

hsh.keys.each_with_index {|k,i| hsh[k] = arr[i]}

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

略短:

hsh.keys.zip(arr){|k, v| hsh[k] = v}

答案 1 :(得分:1)

假设您正在使用Ruby v1.9 +(哈希键在早期版本中没有排序)并且您知道arr中值的顺序与哈希中键的(插入)顺序相对应,那么你可以写:

(第一种方式被删除,因为不如@ sawa的回答)

如果arr可以变异(修改),你可以这样做:

hsh.each_key { |k| hsh[k] = arr.shift }
  #=> {:name=>"joe", :age=>"23", :height=>"179", :weight=>"70"}

或者你可以写:

e = arr.to_enum
hsh.each_key { |k| hsh[k] = e.next }
  #=> {:name=>"joe", :age=>"23", :height=>"179", :weight=>"70"}

不会改变arr。还有很多其他方法。

答案 2 :(得分:1)

略短一点

hsh.keys.zip(arr).to_h
# => {:name=>"joe", :age=>"19", :height=>"179", :weight=>"70"}

如果不支持to_h

Hash[hsh.keys.zip(arr)]
# => {:name=>"joe", :age=>"19", :height=>"179", :weight=>"70"}

答案 3 :(得分:1)

我使用Enumerable#each_with_index

arr  = ["joe", "19", "179", "70"]
hash = {name: "", age: "", height: "", weight: ""}
hash.each_with_index { |(k, _), ind| hash[k] = arr[ind] }
hash # => {:name=>"joe", :age=>"19", :height=>"179", :weight=>"70"}