簡體   English   中英

Ruby中如何使用key路徑遍歷一個hash map?

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

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