如何以递归方式为任意数量的级别发送嵌套哈希:[]方法?

时间:2016-08-21 13:49:24

标签: ruby hash

上下文

我尝试做的是创建一个名为Rspec的{​​{1}} shared_example,用于检查对象的rails json响应,并验证某些属性是否已更新。 json响应可能有也可能没有嵌套属性。钥匙无法提前知道。

实施例

说我有一个哈希,update response

如果密钥深一层,我可以动态地向哈希发送密钥。

hsh = {one_deep: 123, nested: {a: 1, b: 2}}

如果我对方法链进行硬编码,我可以访问嵌套哈希:

def get_value(some_key)
  hsh.send(:[], some_key) 
end

get_value(:one_deep) # => 123

Desired Endstate:

def get_value(some_key, another_key)
  hsh.send(:[], some_key).send(:[], another_key) 
end

get_value(:nested, :a) # => 1
get_value(:nested, :b) # => 2

2 个答案:

答案 0 :(得分:2)

如果你正在使用Ruby 2.3.1,那么你可以使用#dig方法从嵌套的Hash中获取密钥的值。

答案 1 :(得分:2)

对于2.3.1之前的Ruby版本,它很容易实现Hash#dig

Dim CritArray(0 To 3) As String
        CritArray(0) = "Tax"
        CritArray(1) = "Accounting"
        ActiveSheet.Range("$B$4:$H$12").AutoFilter Field:=3, Criteria1:=CritArray

如果class Hash def dig(*keys) keys.reduce(self) { |obj, k| obj && obj[k] } end end obj[k],则nil将设为obj并保持等于nil

试试吧。

nil