【问题标题】:Transform array of objects in Ruby在 Ruby 中转换对象数组
【发布时间】:2015-07-23 21:05:50
【问题描述】:

我有一个 JSON 对象,用于 3 个日期的每个站点的流量。

我想在“日期”上将这三个对象合并在一起。下面的例子。

我正在使用 Ruby。最简单的方法是什么?

启动 JSON:

 [  
   {  
      "Google":[  
         {  
            "Date":"2015-01-01",
            "Value":100
         },
         {  
            "Date":"2015-02-01",
            "Value":200
         },
         {  
            "Date":"2015-03-01",
            "Value":300
         }
      ]
   },
   {  
      "Yahoo":[  
         {  
            "Date":"2015-01-01",
            "Value":1200
         },
         {  
            "Date":"2015-02-01",
            "Value":1300
         },
         {  
            "Date":"2015-03-01",
            "Value":1400
         }
      ]
   },
   {  
      "Bing":[  
         {  
            "Date":"2015-01-01",
            "Value":500
         },
         {  
            "Date":"2015-02-01",
            "Value":600
         },
         {  
            "Date":"2015-03-01",
            "Value":700
         }
      ]
   }
]

结束 JSON:

[
  {  
    "Date":"2015-01-01",
    "Google":100,
    "Yahoo":1200,
    "Bing":500
  },
  {  
    "Date":"2015-01-02",
    "Google":200,
    "Yahoo":1200,
    "Bing":600
  },
  {  
    "Date":"2015-01-03",
    "Google":300,
    "Yahoo":1400,
    "Bing":700
  }
]

【问题讨论】:

  • 我会在 mongo 中使用 map reduce,但如果你想在 Ruby 中使用,请考虑 ruby-doc.org/core-2.2.2/Enumerable.html#method-i-group_by 和 JSON parse/dump
  • 我在问题中看不到任何 JSON 内容。
  • @undur_gongor 作者提到他有一个json数据。
  • @CodeGroover:但所有呈现的数据都只是普通的 Ruby 数据(数组、哈希、字符串),没有 JSON。
  • 你说得对 :) - 数据以 JSON 开头,然后我刚刚做了JSON.parse,所以是的,这个问题实际上只与哈希数组有关。 JSON 标签只是帮助那些希望合并相似 JSON 结构的人。

标签: arrays ruby json


【解决方案1】:
result = array.inject({}) do | a, e | 
  site, data = e.first
  data.each do | x | 
    a[x[:Date]] ||= {}
    a[x[:Date]][site] = x[:Value]
  end
  a
end

给你一个以日期为键的散列。这可以通过以下方式转换为数组:

result.map { | k, v | v.update(:Date => k) }

【讨论】:

  • 和积累部分 a[x[:Date]][site] ? a[x[:Date]][site] += x[:Value] : x[:Value] 并且目标结果是数组
  • 在 JSON 解析之后,它的键也是字符串而不是符号。
  • @CodeGroover:你对 array-vs-hash 的评论是正确的。谢谢。
  • 对不起,当然没有积累,只是改造而已。
【解决方案2】:

假设正是这种结构,可能可行的是

results = [] 

your_array[0]['Google'].each_with_index do |item, index|
  date = item['Date']

  provider_values = your_array.inject({}) do |memo, current|
    provider = current.keys[0]
    value = current[provider][index]['Value']

    memo[provider] = value
    memo
  end 
  results.push({'Date' => date}.merge(provider_values))
end

我目前在 Windows 上,所以我不能 100% 确定正确性,但是修复任何语法错误应该很容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2018-12-06
    • 2011-03-10
    • 2022-12-31
    • 1970-01-01
    相关资源
    最近更新 更多