用于从Nosql数据的散列中获取数据的通用ruby方法实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于从Nosql数据的散列中获取数据的通用ruby方法实现相关的知识,希望对你有一定的参考价值。

如何使用自定义ruby实现从哈希哈希中获取特定值

我有一个以这种特殊格式出现的nosql数据:

{:bookname=>"The Fight for Guadalcanal", 
:sourceSystemId=>"d4ba4799-atil45-4a", 
:checkouttimestamp=>"2018-12-12T04:38:34.476796700Z",:firedevents=>[{:operation=>"GET", :entity=>"warbooks", :keys=>[{:name=>"book_guid", :value=>{:FieldString=>"e33almmatter-syslibrary"}}], 
 :attributes=>[{:libLocation=>"a44364", :value=>{:FieldInteger=>3994}}, {:name=>"big_response", :value=>{:FieldString=>"The Battle for Enderson Field, also"}}],
 :customizable=>true}]}

在ruby中是否有方法提供密钥作为参数参数?

我知道ruby中有fetch方法可以获得值:

test.fetch(:firedevents,()).fetch(:operation))

这确实让我获得了GET的价值

但问题是我有数据集中的数组或散列数可能会因每个操作而异,所以我在寻找一个方法,它给我一个关于传递键作为参数的值。

例如:ruby_mthod(sourceSystemId.to_sym)应该让我d4ba4799-atil45-4a

答案

获取将足以获得sourceSystemId(假设您的数据位于h):

> h.fetch(:sourceSystemId)
# => "d4ba4799-atil45-4a"

如果您正在寻找更通用的东西,请查看Hash#dig。它允许您以一种巧妙的方式链接哈希访问:

> h.fetch(:firedevents).first.fetch(:keys).first.dig(:value, :FieldString)
# => "e33almmatter-syslibrary"

编辑:

正如@Stefan建议的那样,#dig可以用于整个操作:

> h.dig(:firedevents, 0, :keys, 0, :value, :FieldString)
# => "e33almmatter-syslibrary"
另一答案

您可以递归遍历哈希:

def deep_find(key, object=self, found=nil)
    if object.respond_to?(:key?) && object.key?(key)
      return object[key]
    elsif object.is_a? Enumerable
      object.find { |*a| found = deep_find(key, a.last) }
      return found
    end
  end

或者你可以使用来自hashie gem的deep_find

以上是关于用于从Nosql数据的散列中获取数据的通用ruby方法实现的主要内容,如果未能解决你的问题,请参考以下文章

Ruby如何格式化嵌套哈希

Redis-Hash常用命令

如何用 C 编写散列函数?

如何合并散列数组以获取值数组的散列

HashMap中的散列函数冲突解决机制和rehash

数据结构-散列查找