Обобщение JSON для лихого списка

Я создаю задание 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

Я хочу подвести итоги на основе имени участника, но в нем перечислены все записи.

JSON, полученный от API, выглядит следующим образом (я сократил его и изменил только имена), обратите внимание, что factHours может быть равен 0:

[
    {
        "member": {
            "name": "User 1"
        },
        "actualHours": 0.2
    },
    {
        "member": {
            "name": "User 2"
        },
        "actualHours": 1.5
    },
    {
        "member": {
            "name": "User 2"
        },
        "actualHours": 0.17
    }
]

Я также хотел бы отсортировать это так, чтобы у меня был верхний член наверху и т. Д. Я также хотел бы отправить второе событие с первым человеком в списке (чтобы они могли получить золотую звезду).


person Chris Wood    schedule 12.10.2017    source источник


Ответы (2)


Как я понял из вашего вопроса, вам нужно что-то вроде этой агрегации

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

Вы можете перебрать его и отфильтровать то, что вам нужно.

person Stanislav Mekhonoshin    schedule 12.10.2017
comment
Спасибо за помощь, однако я получаю: планировщик поймал исключение: неопределенный метод `[]' для nil:NilClass - person Chris Wood; 12.10.2017
comment
Можете ли вы предоставить полную трассировку? Я предполагаю, что что-то не так с вашими входными данными. Может быть, вы используете строки вместо ключей в хэшах? - person Stanislav Mekhonoshin; 12.10.2017
comment
Поскольку он работает из Dashing, я не получаю полного вывода, но вот что я получаю в ответ: планировщик поймал исключение: неопределенный метод []' for nil:NilClass C:/Dashing/monitoring/jobs/api.rb:85:in block (2 уровня) в ‹top (обязательно)›' C:/Dashing/monitoring/jobs/api. rb:84:in each' C:/Dashing/monitoring/jobs/api.rb:84:in reduce' C:/Dashing/monitoring/jobs/api.rb:84:in `заблокировать в ‹top (обязательно)›' - person Chris Wood; 12.10.2017
comment
C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rufus-scheduler-2.0.24/lib/rufus/sc/jobs.rb:230:in trigger_block' C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rufus-scheduler-2.0.24/lib/rufus/sc/jobs.rb:204:in block в триггере C:/Ruby23-x64 /lib/ruby/gems/2.3.0/gems/rufus-scheduler-2.0.24/lib/rufus/sc/scheduler.rb:430:in `блок в trigger_job' - person Chris Wood; 12.10.2017

Спасибо @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
person Chris Wood    schedule 12.10.2017