Собрать определенные значения из массива хэшей - PullRequest
0 голосов
/ 24 мая 2018

У меня есть этот сложный хеш с именем data в файле JSON, чуть ниже.Меня интересует поле "videoId"

, поэтому я запустил этот код:

puts data["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 голосов
/ 24 мая 2018

Хэш - это словарь, как коллекция уникальных ключей и их значений.Также называемые ассоциативными массивами, они похожи на массивы, но там, где массив использует в качестве индекса целые числа, хэш позволяет использовать любой тип объекта.

Конечно, значением может быть любой объект - строка, метод, nil, число, объект.Итак, только после создания мы можем узнать, что сохраняется в нашем хеше.По этой причине при попытке получить все ключи:

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

Нет вложенного ключа.Таким образом, поиск значения по отсутствующему ключу возвращает nil.

Чтобы выбрать все videoId, вы должны сделать что-то вроде этого:

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

Также вы можете обновить класс Hash как там :

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 будет иметь переменную структуру.

0 голосов
/ 24 мая 2018

Это не массив, это хеш.Чтобы получить все videoId с, можно [Enumerable#map] items массив вывести значения:

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

, в результате чего получается массив videoId с.


В качестве альтернативы можно использовать камень Iteraptor, чтобы просто использовать grep для videoId s:

data.segar(/videoId/) { |*args| puts args.inspect }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...