将哈希值放入ruby中的数组中

时间:2017-07-07 19:01:58

标签: arrays json ruby hash

我试图从json返回中将一个帐号列表插入一个数组中,我将json返回到一个哈希,但我不能因某种原因将值插入数组中。我检查了irb上的哈希位置,并获取了帐号,例如,位置my_hash["aws_accounts"][0]["owner_id"]将获取第一个帐号,my_hash["aws_accounts"][0]["status"]["level"]将获取第一个帐户的状态。

如果其各自的状态颜色为“黄色”,我基本上想要遍历所有帐户并存储帐号。

这是我的代码:

 require 'json'
require 'rest-client'

 j = RestClient.get 'https://chapi.cloudhealthtech.com/v1/aws_accounts?api_key=###&page=1&per_page=100'
 my_hash = JSON.parse(j)
 accnt_size = my_hash["aws_accounts"].size
 intaccntsize = accnt_size.to_i
 account_number_array = Array.new

 x = 0
for accnt_iteration in x..intaccntsize do
     puts accnt_iteration
     if my_hash["aws_accounts"][accnt_iteration]["status"]["level"] == "yellow"
     account_number_array.push(my_hash["aws_accounts"][accnt_iteration]["owner_id"])
     end
end

这是错误信息

in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError)
from C:/Users/----/Desktop/-----/ruby_aws_sdk.rb:12:in `each'
from C:/Users/------/Desktop/-------/ruby_aws_sdk.rb:12:in `<main>'

任何建议都会有所帮助。感谢。

1 个答案:

答案 0 :(得分:1)

问题的实际解决方案是使用3点范围而不是2点(3点是末尾独占,2点是包含端点),如下所示(这使用相同的my_hash作为我的第二个代码块):

for x in 0..my_hash["aws_accounts"].size do
  puts x
end
# 0
# 1
# 2
=> 0..2
my_hash["aws_accounts"][2]
=> nil
for x in 0...my_hash["aws_accounts"].size do
  puts x
end
# 0
# 1
=> 0...2
my_hash["aws_accounts"][1]
=> {"owner_id"=>2, "status"=>{"level"=>"orange"}}

我没有获取帐号数量并尝试通过索引访问它们,而是自己迭代帐户。这是一个快速示例,我相信(根据您的描述)是my_hash的相关部分和您的预期输出。

my_hash = {
  "aws_accounts" => [
    { "owner_id" => 1, "status" => { "level" => "yellow" } },
    { "owner_id" => 2, "status" => { "level" => "orange" } }
  ]
}

account_number_array = []

my_hash["aws_accounts"].each do |account|
  if account["status"]["level"] == "yellow"
    account_number_array << account["owner_id"]
  end
end

puts account_number_array.inspect
# => [1]