从散列数组中收集特定值

时间:2018-05-24 09:31:56

标签: arrays ruby hash

我在JSON文件中有这个称为数据的复杂哈希,就在下面。 我对该领域感兴趣" videoId"

所以我运行了这段代码:

puts data["videoId"] 

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

{
    "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"
            }
        },

2 个答案:

答案 0 :(得分:0)

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

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

生成videoId s。

数组

或者,可以使用Iteraptor gem来为videoId s grep:

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

答案 1 :(得分:0)

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

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

1  2  435
22 3  384

没有任何嵌套密钥。因此,通过缺少键返回data.keys # => ["etag", "items"] 来找到价值。

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

nil

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

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

然后运行

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

当json具有可变结构时,该方法可以避免错误。