我有一个哈希:
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']] }
答案 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"]]}