簡體   English   中英

如何在數組/哈希中遞歸收集指定鍵的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM