我正在创建一个漂亮的作业,从API中提取一些数据(运行Ruby)。
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
}
]我也想对此进行排序,这样我就可以让最高级别的成员担任高级职务。我也想发送第二次活动与名单上的顶级人物(这样他们可以得到一个金星)。
发布于 2017-10-12 16:38:38
感谢@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发布于 2017-10-12 13:43:48
正如我从您的问题中了解到的,您需要类似于这样的聚合。
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]}您可以遍历它并过滤所需的内容。
https://stackoverflow.com/questions/46710591
复制相似问题