【问题标题】:JSON Summarize for Dashing List用于破折号列表的 JSON 汇总
【发布时间】:2017-10-12 13:14:09
【问题描述】:

我正在创建一个从 API 中提取一些数据的 Dashing 作业(这运行 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
    }
]

我还想对此进行排序,以便我可以让顶级成员排在首位。我还想与列表中的第一人发送第二个事件(这样他们就可以获得金星)。

【问题讨论】:

    标签: json ruby associative-array dashing


    【解决方案1】:

    我从你的问题中了解到,你需要这样的聚合

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

    您可以对其进行迭代并过滤您需要的内容。

    【讨论】:

    • 感谢您的帮助,但是我得到:“调度程序捕获异常:未定义的方法 `[]' for nil:NilClass”
    • 你能提供完整的跟踪吗?我猜你的输入数据有问题。也许您在哈希中使用字符串而不是键?
    • 因为它是从 Dashing 运行的,所以我没有得到完整的输出,但这就是我得到的结果:调度程序捕获异常:未定义的方法 []' for nil:NilClass C:/Dashing/monitoring/jobs/api.rb:85:in block (2 级别) in ' 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 `block in '
    • C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rufus-scheduler-2.0.24/lib/rufus/sc/jobs.rb:230:in @987654325 @block in trigger' C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/rufus-scheduler-2.0.24/lib/rufus/sc/scheduler.rb:430:in `block in trigger_job'
    【解决方案2】:

    感谢@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多