我有以下数组(没有深度限制):
[
{
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")
你知道我应该如何编写这个函数吗?
答案 0 :(得分:4)
假设您知道子结构位于:children
:
def extract(sequence, key)
sequence.flat_map do |hash|
[hash[key], *extract(hash[:children] || [], key)]
end
end
答案 1 :(得分:2)
以下是使用[<<"3">>,<<"4">>,<<"2">>,<<"3">>,<<"4">>,<<"2">>]
区分您将遇到的各种对象类型的方法:
case
答案 2 :(得分:2)
这是一种快速而脆弱的正则表达方式
def find_nested(arr, key)
arr.to_s.scan(/#{key.to_sym}=>"([^"]+)/).flatten
end
答案 3 :(得分:0)
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"]