【问题标题】:Ruby For loop through JSON response from APIRuby For 循环通过来自 API 的 JSON 响应
【发布时间】:2019-01-31 01:55:41
【问题描述】:

我有一段功能完善的代码可以做我想做的事,但它确实很重,我相信在某处使用一个不错的 For 循环可以大大改进它,但我不知道如何去做

我的代码是:

def helper
response = RestClient.get API_RESPONSE
check_X_0 = JSON.parse(response.body)['EXP'][0]['X']
check_Y_0 = JSON.parse(response.body)['EXP'][0]['Y']
check_X_1 = JSON.parse(response.body)['EXP'][1]['X']
check_Y_1 = JSON.parse(response.body)['EXP'][1]['Y']
check_X_2 = JSON.parse(response.body)['EXP'][2]['X']
check_Y_2 = JSON.parse(response.body)['EXP'][2]['Y']
check_X_3 = JSON.parse(response.body)['EXP'][3]['X']
check_Y_3 = JSON.parse(response.body)['EXP'][3]['Y']
check_X_4 = JSON.parse(response.body)['EXP'][4]['X']
check_Y_4 = JSON.parse(response.body)['EXP'][4]['Y']
if check_X_0 == false && check_Y_0 == true
  exp_id = JSON.parse(response.body)['EXP'][0]['ABC']
elsif check_X_1 == false && check_Y_1 == true
  exp_id = JSON.parse(response.body)['EXP'][1]['ABC']
elsif check_X_2 == false && check_Y_2 == true
  exp_id = JSON.parse(response.body)['EXP'][2]['ABC']
elsif check_X_3 == false && check_Y_3 == true
  exp_id = JSON.parse(response.body)['EXP'][3]['ABC']
elsif check_X_4 == false && check_Y_4 == true
  exp_id = JSON.parse(response.body)['EXP'][4]['ABC']
else
  puts 'Nothing valid - use default'
  exp_id = JSON.parse(response.body)['EXP'][1]['ABC']
end

这是相当麻烦的,所以任何人都可以帮我修剪一下吗?

【问题讨论】:

  • this 有帮助吗?

标签: ruby loops jsonresponse


【解决方案1】:

你不应该首先解析你的 json 10 次。解析一次并使用结果。

rb = RestClient.get(API_RESPONSE).body['EXP']

checks = (0..4).map { |i, s| [i, rb[i]['X'], rb[i]['Y']]  }
exp_id =
  if found = checks.detect { |_i, f, t| !f && t }
    rb[found.first]['ABC']
  else
    puts 'Nothing valid - use default'
    rb[1]['ABC']
  end

【讨论】:

  • 这真的很有帮助,谢谢!使用 .detect 函数,这里的参数是如何布置的?我假设'f'和't'值是真假等价,但是如果说Y值是“helloWorld”字符串,这将如何布局?我尝试对其进行编辑,但我一直遇到语法错误...
  • 你把puts [i, f, t].inspect放在那里然后自己检查一下怎么样?块参数始终是可迭代对象(在本例中为checks)所包含的内容。因此,它们将是上一个 map 调用中的 [i, rb[i]['X'], rb[i]['Y']]。
  • 我得到了正确的内容,我已经在puts checks 行中看到了这一点,但我不确定在IF 中将我的预期值放在哪里。如果我在{ |-i,f,t| 部分输入我想要查找的值,那么我会收到语法错误,如果我将它们放入!f && t } 部分,那么我实际上并没有找到我输入的值,实际上只是返回ABC 的值来自可迭代的第一个 i 值。我想我错过了一些非常明显的东西,但我不确定我明白了......
  • { |_i, f, t| !f && t } → { |i, f, t| puts([i, f, t].inspect); !f && t }.
  • 所以这会返回地图中的第一个 i 值。我怎样才能让它迭代直到它找到X 响应和Y 响应的特定组合并将i 值返回到ABC 请求中?说,如果我想要的组合在 [3] 位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
相关资源
最近更新 更多