【问题标题】:putting a hash value into an array in ruby将哈希值放入 ruby​​ 中的数组中
【发布时间】:2023-03-27 14:35:01
【问题描述】:

我正在尝试将帐号列表从 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>'

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

【问题讨论】:

  • 这个问题可以通过一个例子来改进。给出一个简化的散列(不引用 JSON 字符串)和数组,并显示你想要的结果(作为一个有效的 Ruby 对象)。为每个输入分配一个变量会很有帮助(例如,arr = [1,2,3...]h = { ...})。这样,读者可以在不定义变量的情况下引用它们。

标签: arrays json ruby hash


【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多