我想将两个散列数组合并到一个新数组中:
array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]这就是我想要的结果:
new_array = [{"Name1" => {gender: ['female', 'male'], nationality: ['german', 'danish', 'austrian']}}]我在Ruby文档中可以找到的唯一合并选项是用其他哈希覆盖重复项。那么,我如何才能实现我需要的版本呢?
发布于 2014-03-22 19:16:43
可以将可选块参数传递给Hash#merge。对重复的键调用该块。在块的返回值中,将使用而不是被覆盖。
array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]
new_array = [{'Name1' => array1[0]['Name1'].merge(array2[0]['Name1']) { |k,o,n|
Array(o) | Array(n)
}}]
# => [{"Name1"=>
# {:gender=>["female", "male"],
# :nationality=>["german", "danish", "austrian"]}}]发布于 2014-03-22 19:24:53
递归方式:
array1 = [{"Name1" => {gender: 'female', nationality: ['german', 'danish']}}]
array2 = [{"Name1" => {gender: 'male', nationality: ['german', 'austrian']}}]
def merge_recur(ar1,ar2)
(ar1+ar2).inject do |h1,h2|
h1.merge(h2) do |k,o,n|
if o.is_a?(Hash) and n.is_a?(Hash)
merge_recur([o],[n])
elsif o.is_a?(Array) and n.is_a?(Array)
o | n
else
[o,n]
end
end
end
end
merge_recur(array1,array2)
# => {"Name1"=>
# {:gender=>["female", "male"],
# :nationality=>["german", "danish", "austrian"]}}https://stackoverflow.com/questions/22582238
复制相似问题