JSON 为短跑列表汇总

JSON Summarize for Dashing List

我正在创建一个 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 如下所示(我已将其缩短,仅更改了名称),请注意 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

它将return以下输出

{"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