从哈希数组中收集特定值

Posted

技术标签:

【中文标题】从哈希数组中收集特定值【英文标题】:Collect specific values from an array of hashes 【发布时间】:2018-11-03 11:19:53 【问题描述】:

我在一个 JSON 文件中有这个称为数据的复杂哈希,就在下面。 我对“videoId”字段感兴趣

所以我运行了这段代码:

puts data["videoId"] 

但我没有得到任何结果。在 ruby​​ 中获取所有 videosid 的最佳方法是什么?为什么代码不起作用?


    "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/2rushbFMdJCgH0PsUecXvdIjrIA\"",
    "items": [
        
            "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/SGIvedEKHZeJcInXZg-T4Lde7gE\"",
            "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLnhTWTc1cUpfa0lr",
            "kind": "youtube#playlistItem",
            "snippet": 

                "publishedAt": "2018-05-21T16:00:00.000+00:00",
                "resourceId": 
                    "kind": "youtube#video",
                    "videoId": "xSY75qJ_kIk"
                ,

                "title": "The Key (Wax Trax Mix) - Space Bunny | Surreal [1998]"
            
        ,
        
            "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/Z7hQMBr8AzIyI7n2LPBnd7AUwjs\"",
            "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmVISWd4c2EzckVz",
            "kind": "youtube#playlistItem",
            "snippet": 

                "publishedAt": "2018-05-18T08:00:00.000+00:00",
                "resourceId": 
                    "kind": "youtube#video",
                    "videoId": "eHIgxsa3rEs"

                    
                ,
                "title": "Coin coin Pata'tribe mix [Old School Tekno Tribe]"
            
        ,
        
            "etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/T2xQFVjUHZYJ2FHGa4Yb82yMubc\"",
            "id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmgxMFlVSVVxb1lN",
            "kind": "youtube#playlistItem",
            "snippet": 

                "publishedAt": "2018-05-17T16:00:00.000+00:00",
                "resourceId": 
                    "kind": "youtube#video",
                    "videoId": "h10YUIUqoYM"
                ,

                "title": "Lil Louis 1992.09.25 @ Hacienda"
            
        ,

【问题讨论】:

【参考方案1】:

哈希是一个类似于字典的唯一键及其值的集合。也称为关联数组,它们与数组类似,但在数组使用整数作为索引的情况下,哈希允许您使用任何对象类型。

当然,值可以是任何对象——字符串、方法、nil、数字、对象。所以,只有在创建之后,我们才能知道它保存在我们的哈希中。因此,在尝试获取所有密钥时:

data.keys # => ["etag", "items"]

没有任何嵌套键。所以通过缺少键返回nil来寻找价值。

要选择所有 videoId,您必须执行以下操作:

data["items"].map  |item| item["snippet"]["resourceId"]["videoId"] .compact

另外,您可以将 Hash 类更新为there:

class Hash
  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
end

然后运行

data["items"].map  |item| item.deep_find('videoId') 

该方法避免了json将具有可变结构时的错误。

【讨论】:

【参考方案2】:

这不是一个数组,这是一个哈希。要获取所有 videoIds,可以使用 [Enumerable#map] items 数组来挖掘值:

data["items"].map  |item| item["snippet"]["resourceId"]["videoId"] 

产生videoIds 的数组。


或者,可以使用 Iteraptor gem 来 grep 查找 videoIds:

data.segar(/videoId/)  |*args| puts args.inspect 

【讨论】:

非常感谢!是的,你是对的,它是一个哈希,:)。 你的其他方式也很好,感谢分享Iteraptor gem 如果我要感谢自己,我首先要感谢编写这颗宝石。

以上是关于从哈希数组中收集特定值的主要内容,如果未能解决你的问题,请参考以下文章

算法常见数组搜索算法

如何将哈希值转换为数组

检查哈希表数组是不是包含哈希表

Ruby .store 函数将哈希值从数组更改为单个值

使用 Jquery 收集数组中的行 ID,然后为新表查询这些值

如何在哈希数组中获取特定键?