我正在创建一个Dashing作业,从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如下所示(我已将其缩短,仅更改了名称),请注意realHours可以为0:
[
{
"member": {
"name": "User 1"
},
"actualHours": 0.2
},
{
"member": {
"name": "User 2"
},
"actualHours": 1.5
},
{
"member": {
"name": "User 2"
},
"actualHours": 0.17
}
]
我还想对此进行排序,以便我可以让顶级成员位于顶部。我还想与名单中的最高人一起发送第二个活动(这样他们就可以获得金星)。
答案 0 :(得分:0)
正如我从你的问题中所理解的,你需要像这样的聚合
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]}
您可以对其进行迭代并过滤所需内容。
答案 1 :(得分:0)
感谢@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