استخراج قيمة محددة من التجزئة متعددة الأبعاد في Ruby باسم المفتاح
-
19-09-2019 - |
سؤال
دعنا نقول أن لدي تجميل متعدد الأبعاد، وفي واحدة من البوعية لدي مفتاح => زوج القيمة التي أحتاجها لاستردادها عن طريق المفتاح. كيف يمكنني فعل ذلك؟
مثال التجريم:
h={:x=>1,:y=>2,:z=>{:a=>{:k=>"needle"}}}
h={:k=>"needle"}
المفتاح هو دائما: ك، وأنا بحاجة للحصول على "إبرة"
لقد لاحظت أنه لا توجد وظيفة "تسطيح" للحصم في روبي 1.8، ولكن إذا كان هناك، فأنا أتصور أنني فقط
h.flatten[:k]
أتصور أنني بحاجة إلى كتابة وظيفة متكررة لذلك؟
شكرا
المحلول
يمكنك دائما كتابة امتداد خاصتك الخاصة بالهزم الذي يقوم بالعمل القذر لك:
class Hash
def recursive_find_by_key(key)
# Create a stack of hashes to search through for the needle which
# is initially this hash
stack = [ self ]
# So long as there are more haystacks to search...
while (to_search = stack.pop)
# ...keep searching for this particular key...
to_search.each do |k, v|
# ...and return the corresponding value if it is found.
return v if (k == key)
# If this value can be recursively searched...
if (v.respond_to?(:recursive_find_by_key))
# ...push that on to the list of places to search.
stack << v
end
end
end
end
end
يمكنك استخدام هذا ببساطة:
h={:x=>1,:y=>2,:z=>{:a=>{:k=>"needle"}}}
puts h.recursive_find_by_key(:k).inspect
# => "needle"
h={:k=>"needle"}
puts h.recursive_find_by_key(:k).inspect
# => "needle"
puts h.recursive_find_by_key(:foo).inspect
# => nil
نصائح أخرى
إذا كنت بحاجة لمجرد إحضار القيمة الرئيسية، ولكن لا تعرف مدى عمق المفتاح، استخدم هذا المقتطف
def find_tag_val(hash, tag)
hash.map do |k, v|
return v if k.to_sym == tag
vr = find_tag_val(v, tag) if v.kind_of?(Hash)
return vr if vr
end
nil #othervice
end
h = {message: { key: 'val'}}
find_tag_val(h, :key) #=> 'val'
لا تنتمي إلى StackOverflow