![](/img/trans.png)
[英]Search recursively through a deeply nested object/array and collect values that include a specified string without knowing the key(s)
[英]How collect values of a specified key recursively in a Array/Hash
我有以下數組(不限深度):
[
{
name: "foo",
age: 12,
children: [{
name: "zoo",
age: 44
},
{
name: "taz",
age: 17,
children: [{
name: 'tof',
age: 23
},
{
name: 'tok',
age: 42
}
]
}
]
},
{
name: "bar",
age: 54
}
]
我想收集鍵name
所有不同值,在此示例中,結果將是:
(順序無關緊要)
['foo', 'zoo', 'taz', 'tof', 'tok', 'bar']
具有類似的功能
def func(my_array, "name")
你有什么主意,我應該如何編碼該功能?
假設您知道子結構位於:children
:
def extract(sequence, key)
sequence.flat_map do |hash|
[hash[key], *extract(hash[:children] || [], key)]
end
end
這是一種使用case
來區分您將遇到的各種對象類型的方法:
def find_names(object, key_name)
case (object)
when Array
object.flat_map do |e|
find_names(e, key_name)
end
when Hash
[ object[key_name] ] + find_names(object.values, key_name).compact
end
end
這是一種快速但易碎的正則表達式
def find_nested(arr, key)
arr.to_s.scan(/#{key.to_sym}=>"([^"]+)/).flatten
end
def find_em(arr)
arr.each_with_object([]) do |h,a|
a << h[:name]
a.concat(find_em(h[:children])) if h.key?(:children)
end
end
find_em(arr)
#=> ["foo", "zoo", "taz", "tof", "tok", "bar"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.