从哈希数组中收集特定值
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】:这不是一个数组,这是一个哈希。要获取所有 videoId
s,可以使用 [Enumerable#map
] items
数组来挖掘值:
data["items"].map |item| item["snippet"]["resourceId"]["videoId"]
产生videoId
s 的数组。
或者,可以使用 Iteraptor
gem 来 grep 查找 videoId
s:
data.segar(/videoId/) |*args| puts args.inspect
【讨论】:
非常感谢!是的,你是对的,它是一个哈希,:)。 你的其他方式也很好,感谢分享Iteraptor gem 如果我要感谢自己,我首先要感谢编写这颗宝石。以上是关于从哈希数组中收集特定值的主要内容,如果未能解决你的问题,请参考以下文章