【问题标题】:Ruby Loop Array and Create Hash for Each Array ObjectRuby 循环数组并为每个数组对象创建哈希
【发布时间】:2014-07-16 16:13:39
【问题描述】:

我想遍历一个数组并为数组中的每个对象创建一个哈希,然后将所有这些哈希分组到一个哈希数组中。

这是我的一个示例起始数组:

urls = ["http://stackoverflow.com", "http://example.com", "http://foobar.com"]

现在假设我想将每个 URL 的哈希值放入这样的数组中:

urls =[ { 
'url' => "http://stackoverflow.com",
'dns_status' => "200",
'title' => "Stack Overflow"
},
{
'url' => "http://example.com",
'dns_status'=> "200",
'title' => "Example"
}
]

抛开我在示例中获取dns_statustitle 键值的位置不谈,我想我缺少的是如何遍历原始数组并为每个对象创建一个哈希...

我玩过injectcollectmapeach 并阅读了文档,但不能完全理解它或得到任何工作。

有什么推荐吗?使用课程会更容易完成吗?

编辑:

感谢大家的帮助。想通了,让它工作。干杯!

【问题讨论】:

  • 你能澄清一下这个问题吗?我目前有点困惑。我知道您有一个数组(称为 urls),但是您想实现什么?您希望将数组转换为哈希数组吗?
  • 是的。我想为数组中的每个 url 创建一个哈希。散列将具有诸如 :url 之类的键和一些其他值,稍后我将在真实脚本中进行 api 查找

标签: ruby arrays hash


【解决方案1】:

对可枚举事物的每个元素做一些事情并将结果存储在一个数组中:这就是map 所做的事情。在块中指定您想要的内容,如下所示:

urls = ["http://stackoverflow.com", "http://example.com", "http://foobar.com"]
p res = urls.map{|url| {"url"=>url, "dns_status"=>200, "title"=>url[7..-5]} }

#=> [{"url"=>"http://stackoverflow.com", "dns_status"=>200, "title"=>"stackoverflow"}, {"url"=>"http://example.com", "dns_status"=>200, "title"=>"example"}, {"url"=>"http://foobar.com", "dns_status"=>200, "title"=>"foobar"}]

【讨论】:

  • 完美。正是我想要的。工作。
  • 来吧,steen,请不要水平滚动。
【解决方案2】:

“我缺少的是如何遍历原始数组并为每个对象创建一个哈希......”

urls = [
  "http://stackoverflow.com",
  "http://example.com",
  "http://foobar.com"
]
urls.each {|entry|
  puts entry
}

例如,您可以使用 .map!。但我仍然不确定你的目标结果应该是什么。这个怎么样?

urls.map! {|entry|
  { 'url' => entry, 'dns_status' => "200", 'title' => "Stack Overflow"}
}
urls # => [{"url"=>"http://stackoverflow.com", "dns_status"=>"200", "title"=>"Stack Overflow"}, {"url"=>"http://example.com", "dns_status"=>"200", "title"=>"Stack Overflow"}, {"url"=>"http://foobar.com", "dns_status"=>"200", "title"=>"Stack Overflow"}]

哎呀,结果很难看。是这样的:

[
{
  "url"=>"http://stackoverflow.com",
  "dns_status"=>"200",
  "title"=>"Stack Overflow"
},
{
  "url"=>"http://example.com",
  "dns_status"=>"200",
  "title"=>"Stack Overflow"
},
{
  "url"=>"http://foobar.com",
  "dns_status"=>"200",
  "title"=>"Stack Overflow"
}
]

显然,您仍然需要为标题提供正确的内容, 但你没有在你原来的问题中给出这个,所以我不能 填写。

【讨论】:

  • 为什么是map! 而不是map
  • map! 不仅会破坏原始数组,而且@steenslag 已经提供了使用map 的解决方案。爆炸的添加是一个单独答案的可疑理由。此外,"Stack Overflow" 并不是所有元素的title 的值。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多