JSON总结了短跑名单
问题描述:
我创建从一个API拉下来一些数据潇洒的工作(运行Ruby)的JSON总结了短跑名单
SCHEDULER.every '15m', :first_in => 0 do |job|
url = "https://blah.com
response = RestClient.get(url, {:Authorization => 'blahblah'})
current_timelist = JSON.parse(response)
acctitems = current_timelist.map do |row|
row = {
:label => row['member']['name'],
:value => row['actualHours']
}
end
# Update the List widget
send_event('timelist', { items: acctitems })
end
我想基于成员的名字来概括,但它会列出每个条目。
是从API收到的JSON如下所示(我已缩短了这一点,只更改了名字),请注意actualHours可以是0:
[
{
"member": {
"name": "User 1"
},
"actualHours": 0.2
},
{
"member": {
"name": "User 2"
},
"actualHours": 1.5
},
{
"member": {
"name": "User 2"
},
"actualHours": 0.17
}
]
我也想解决这使我可以拥有*成员的顶尖成员。我还想向列表中的*人员发送第二个活动(以便他们可以获得金色的明星)。
答
当我从你的问题的理解,你需要像这样聚集
out = h.reduce({}) do |result, item|
key = item[:member][:name]
if result[key].nil?
result[key] = [item[:actualHours]]
else
result[key].push(item[:actualHours])
end
result
end
它将返回下面的输出
{"User 1"=>[0.2], "User 2"=>[1.5, 0.17]}
可以遍历并筛选你所需要的。
答
感谢@Stanislav为他的代码,因为这形成了我设法修复的基础。
SCHEDULER.every '15m', :first_in => 0 do |job|
url = "website.com"
response = RestClient.get(url, {:Authorization => 'BlahBlah'})
current_timelist = JSON.parse(response)
time = {}
acctitems = current_timelist.map do |row|
key = row['member']['name']
value = row['actualHours']
if time[key].nil?
time[key] = [value]
else
time[key].push(value)
end
end
resulttime = time.map do |result|
result = {
:label => result[0],
:value => result[1].inject(:+)
}
end
# Update the List widget
send_event('timelist', { items: resulttime })
end
感谢您的帮助,我得到不过:“调度程序捕获的异常:未定义的方法'[]”为无:NilClass” –
你能提供完整的痕迹?我猜你的输入数据有问题。也许你在散列中使用字符串而不是密钥? –
由于从Dashing运行,我没有得到完整的输出,但这是我回来的: 调度程序捕获异常: 未定义的方法'[]'为零:NilClass C:/Dashing/monitoring/jobs/api.rb :85:在'块(2级)中'' C:/Dashing/monitoring/jobs/api.rb:84:在'each'中 C:/ Dashing/monitoring/jobs/api。 rb:84:in'reduce' C:/Dashing/monitoring/jobs/api.rb:84:在' –