[英]How to use a key path to traverse a hash map in Ruby?
所以我有一個嵌套的 hash,如下所示:
nested_hash = {
foo: foo,
bar: {
foo: foo,
bar: {
foo: foo,
bar: {
foo: bar
}
}
}
}
要訪問不同級別的值,您可以使用多種方法,如下所示:
def one_level(key1)
nested_hash[key1]
end
def two_levels(key1, key2)
nested_hash[key1][key2]
end
def three_levels(key1, key2, key3)
nested_hash[key1][key2][key3]
end
但也許您需要像這樣的一種方法:
def up_to_three_levels(key1, key2, key3)
if key1 && key2 && key3
nested_hash[key1][key2][key3]
elif key1 && key2
nested_hash[key1][key2]
else
nested_hash[key1]
end
end
這顯然不理想並且無法擴展。 如果我可以傳遞任意長度的數組以達到任意級別,那就太好了。 有沒有辦法做到這一點?
(對於上下文:我要解決的問題是我需要將關鍵路徑作為參數並使用它從多個不同的數據結構中獲取數據。)
是的。 這叫做dig
:
nested_hash.dig(key1, key2, key3)
它不采用數組,但有 splat 運算符 ( *
) 可讓您將數組轉換為參數列表,如下所示:
nested_hash.dig(*[key1, key2, key3])
並不是說您必須自己實現它,但我認為知道這是一個非常簡單的遞歸問題,只需幾行代碼即可解決,這很有用:
def dig(collection, keys)
if keys.length == 0 || collection == nil
collection
else
dig(collection[keys[0]], keys.drop(1))
end
end
同樣值得注意的是dig
也存在於 arrays 上,您可以在嵌套結構中混合使用 arrays 和 hash 映射,並使用dig
無縫遍歷它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.