从 ruby 哈希中获取所有键,其中值是带有哈希的数组
Get all keys from ruby hash also where value is array with hashes
如果我有一个 Hash
,例如子哈希,它们嵌套在 Hash
:
值的数组中
{"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}
def get_keys(hash)
(hash.keys + hash.values.grep(Hash){|sub_hash| get_keys(sub_hash)}).flatten
end
使用前面的函数我只能得到 ["school","teachers"]
,但我还需要散列的键,它们在 "teachers" 值的数组中:["school","teachers","name","age","name","age"]
最好我想消除结果中的重复项:["school","teachers","name","age"]
您可以使用 Enumerable#each_with_object
来做这样的事情,当值是一个数组时,为数组中的每个对象递归调用相同的函数。
hash = {"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}
def get_keys(hash)
hash.each_with_object([]) do |(k, v), arr|
arr << k
if v.is_a? Array
arr << v.map { |hash2| get_keys(hash2) }.uniq
end
end
end
puts get_keys(hash)
=> ["school", "teachers", "name", "age"]
def get_keys(object)
if object.is_a? Hash
(object.keys + get_keys(object.values)).flatten.uniq
elsif object.is_a? Array
object.collect{|value| get_keys value}
else
[]
end
end
我觉得这个说的很清楚了,你想嵌套多少就嵌套多少。
如果对象不是数组或散列,则没有键。
如果它是一个数组,它将寻找可能在所有元素中的键
如果它是一个散列,它将 return 它的键,加上可能在散列值上的散列键。然后应用 flatten
删除可能的空数组,并应用 uniq
删除重复值。
对于数组,它将获取可能在
中的键
如果我有一个 Hash
,例如子哈希,它们嵌套在 Hash
:
{"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}
def get_keys(hash)
(hash.keys + hash.values.grep(Hash){|sub_hash| get_keys(sub_hash)}).flatten
end
使用前面的函数我只能得到 ["school","teachers"]
,但我还需要散列的键,它们在 "teachers" 值的数组中:["school","teachers","name","age","name","age"]
最好我想消除结果中的重复项:["school","teachers","name","age"]
您可以使用 Enumerable#each_with_object
来做这样的事情,当值是一个数组时,为数组中的每个对象递归调用相同的函数。
hash = {"school" => "School name", "teachers" => [{"name" => "Schmith", "age" => 34},{"name" => "McRight", "age" => 51}]}
def get_keys(hash)
hash.each_with_object([]) do |(k, v), arr|
arr << k
if v.is_a? Array
arr << v.map { |hash2| get_keys(hash2) }.uniq
end
end
end
puts get_keys(hash)
=> ["school", "teachers", "name", "age"]
def get_keys(object)
if object.is_a? Hash
(object.keys + get_keys(object.values)).flatten.uniq
elsif object.is_a? Array
object.collect{|value| get_keys value}
else
[]
end
end
我觉得这个说的很清楚了,你想嵌套多少就嵌套多少。
如果对象不是数组或散列,则没有键。
如果它是一个数组,它将寻找可能在所有元素中的键
如果它是一个散列,它将 return 它的键,加上可能在散列值上的散列键。然后应用 flatten
删除可能的空数组,并应用 uniq
删除重复值。
对于数组,它将获取可能在
中的键