JSON汇总Dashing List

时间:2017-10-12 13:14:09

标签: json ruby associative-array dashing

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

我还想对此进行排序,以便我可以让顶级成员位于顶部。我还想与名单中的最高人一起发送第二个活动(这样他们就可以获得金星)。

2 个答案:

答案 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