如果属性的条件为true,我希望API的push元素进入我的数组。因此k_api_hash['awsaccounts'][i]['sandman']
将返回true
或false
,如果条件为真,我想将帐号输入数组; (k_api_hash['awsaccounts'][i]['accountnumber'])
会返回一个帐号。
代码:
k_api_hash = JSON.parse(kens_api)
aws_account_size = k_api_hash["awsaccounts"].size
aws_account_array = []
i = 0
while i < aws_account_size
if k_api_hash['awsaccounts'][i]['sandman'] == "true"
aws_account_array.push(k_api_hash['awsaccounts'][i]['accountnumber'])
i += 1
else
i += 1
end
end
puts "Here are all the aws accounts"
puts aws_account_array.inspect
问题是它返回空值,但如果取出if
条件,则成功将帐号推入数组。
输出:
Here are all the aws accounts
[]
答案 0 :(得分:0)
if
每次都会返回false
,因为您要将"true"
( String )与true
进行比较( TrueClass )/ false
( FalseClass );请考虑以下代码:
true == "true"
#=> false
false == "true"
#=> false
true != "true"
#=> true
要使其有效,只需从== "true"
中删除if
1 :
if k_api_hash['awsaccounts'][i]['sandman']
1 请记住,if
中的任何表达式都会返回true
/ false
(或 truthy / 这个问题的假值值无需进一步比较。
与错误无关,但可以通过使用不同的迭代器并删除不必要的变量来优化代码;例如,以下代码将产生相同的输出:
k_api_hash = JSON.parse(kens_api)
aws_account_array = k_api_hash["awsaccounts"].each_with_object([]) do |account, r|
r << aws_account_array.push(account['accountnumber']) if account['sandman']
end
要更好地了解正在发生的事情,请查看Enumerable#each_with_object
。
答案 1 :(得分:0)
我认为这可以胜任:
k_api_hash = JSON.parse(kens_api)
awsaccounts = k_api_hash['awsaccounts']
aws_account_array = awsaccounts.reduce([]) { |array, acc|
array << acc['accountnumber'] if acc['sandman']
array
}
如果API返回的字符串布尔值如"true"
或"false"
,则可以执行以下哈希:
bools = {true=>true, 'true'=>true}
并使用api返回作为reduce
中的键来调用它 array << acc['accountnumber'] if bools[acc['sandman']]