将数组添加到哈希值中

时间:2015-06-27 16:06:26

标签: arrays ruby hash

我有一个哈希:

h={'key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3'}

并为每个键,一个相应的数组:

array1=['string1', 'string2'] 
array2=['string3', 'string4']
array3=['string5', 'string6']

我想得到这样的哈希:

h={ 'key1'=>['value1', ['string1', 'string2']],
    'key2'=>['value2', ['string3', 'string4']],
    'key3'=>['value3', ['string5', 'string6']] }

1 个答案:

答案 0 :(得分:0)

h = { 'key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3' }
array1 = ["my dog", "has", "fleas"] 
array2 = ["my cat", "has", "9 lives"]
array3 = ["my pig", "--wait, I don't", "have a pig"]
array  = [array1, array2, array3]

有很多方法可以做到这一点。这是两个。请注意,所有都假设h中的密钥插入顺序被保留,只有在使用Ruby v1.9 +时才会这样。此外,您要添加到散列h的每个值的对象类型(此处为数组)无关紧要。如果要添加的对象(array的元素)是任何类型的对象(哈希,字符串,符号,类实例,等等),则应用相同的解决方案。

#1:使用Enumerable#zip

h.zip(array).each { |(k,v),a| h[k] = [v,a] }
h
  #=> {"key1"=>["value1", ["my dog", "has", "fleas"]],
  #    "key2"=>["value2", ["my cat", "has", "9 lives"]],
  #    "key3"=>["value3", ["my pig", "--wait, I don't", "have a pig"]]}

#2:使用Hash#merge

此方法使用Hash#merge的形式,该形式使用散列来确定合并的两个散列中存在的键的值。由于h正在与自身合并,因此会为每个键调用该块。如果您希望修改h,请改用Hash#merge!(又名update)。

a = array.dup
h.merge(h) { |_,v| [v, a.shift] }
  #=> {"key1"=>["value1", ["my dog", "has", "fleas"]],
  #    "key2"=>["value2", ["my cat", "has", "9 lives"]],
  #    "key3"=>["value3", ["my pig", "--wait, I don't", "have a pig"]]}