【问题标题】: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"
            }
        },

【问题讨论】:

    标签: arrays ruby hash


    【解决方案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
      • 如果我要感谢自己,我首先要感谢编写这颗宝石。
      猜你喜欢
      • 2016-05-29
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2019-02-12
      • 2021-10-19
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多