将深度嵌套哈希转换为 ruby 中的多维数组
Transforming deep nested hash into multidimensional array in ruby
我想递归地将嵌套哈希转换为多维数组。
这是我当前的代码:
def deep_to_a(hash)
return hash.to_a.each {|k, v|
if k.is_a?(Hash) then
hash[k.to_a] = hash.delete(k)
deep_to_a(k)
elsif v.is_a?(Hash) then
hash[k] = hash[k].to_a
if hash[k].any?{|k, v| k.is_a?(Hash) || v.is_a?(Hash)}
deep_to_a(v)
end
end
}
end
我想得到:
h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h) # => [[11, [[12, 13], [14, 15]]], [16, 17]]
但是我明白了
[[11, {12=>13, 14=>15}], [16, 17]]
我怎样才能让它发挥作用?
破坏性函数很难调试。
在这种情况下,map
优于 each
+ 破坏性赋值。
hash.to_a
的结果是一个数组,所以你的迭代|k, v|
不正确。
def deep_to_a(hash)
hash.map do |v|
if v.is_a?(Hash) or v.is_a?(Array) then
deep_to_a(v)
else
v
end
end
end
h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h)
# [[11, [[12, 13], [14, 15]]], [16, 17]]
def deep_to_a(h)
h.map { |k,v| [k, Hash === v ? deep_to_a(v) : v] }
end
deep_to_a({11=>{12=>13, 14=>15}, 16=>17})
#=> [[11, [[12, 13], [14, 15]]], [16, 17]]
我想递归地将嵌套哈希转换为多维数组。
这是我当前的代码:
def deep_to_a(hash)
return hash.to_a.each {|k, v|
if k.is_a?(Hash) then
hash[k.to_a] = hash.delete(k)
deep_to_a(k)
elsif v.is_a?(Hash) then
hash[k] = hash[k].to_a
if hash[k].any?{|k, v| k.is_a?(Hash) || v.is_a?(Hash)}
deep_to_a(v)
end
end
}
end
我想得到:
h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h) # => [[11, [[12, 13], [14, 15]]], [16, 17]]
但是我明白了
[[11, {12=>13, 14=>15}], [16, 17]]
我怎样才能让它发挥作用?
破坏性函数很难调试。
在这种情况下,map
优于 each
+ 破坏性赋值。
hash.to_a
的结果是一个数组,所以你的迭代|k, v|
不正确。
def deep_to_a(hash)
hash.map do |v|
if v.is_a?(Hash) or v.is_a?(Array) then
deep_to_a(v)
else
v
end
end
end
h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h)
# [[11, [[12, 13], [14, 15]]], [16, 17]]
def deep_to_a(h)
h.map { |k,v| [k, Hash === v ? deep_to_a(v) : v] }
end
deep_to_a({11=>{12=>13, 14=>15}, 16=>17})
#=> [[11, [[12, 13], [14, 15]]], [16, 17]]