2017-10-12 96 views
0

我创建从一个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 
    } 
] 

我也想解决这使我可以拥有顶级成员的顶尖成员。我还想向列表中的顶级人员发送第二个活动(以便他们可以获得金色的明星)。

回答

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]} 

可以遍历并筛选你所需要的。

+0

感谢您的帮助,我得到不过:“调度程序捕获的异常:未定义的方法'[]”为无:NilClass” –

+0

你能提供完整的痕迹?我猜你的输入数据有问题。也许你在散列中使用字符串而不是密钥? –

+0

由于从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:在' –

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