如何在Array / Hash中递归收集指定键的值

时间:2016-02-10 17:08:26

标签: arrays ruby function recursion 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")

你知道我应该如何编写这个函数吗?

4 个答案:

答案 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"]