-1

所以我有一个看起来像这样的哈希数组(json格式)

[
  {
    "2017-04-01 00:00:00 UTC": 100.992226272734
  },
  {
    "2017-03-01 00:00:00 UTC": 3.0594465818934964
  },
]

现在我想用静态键日期将每个键映射到新值:,它与值的方式相同,每个值都有新的静态键值:,我的意思是那些哈希现在看起来像:

[
{
  "date": "2017-04-01 00:00:00 UTC",
  "value": 100.992226272734
},
{
 "date": "2017-03-01 00:00:00 UTC",
  "value": 3.0594465818934964
}
]

任何人都可以帮我展示最好的方法吗?

4

3 回答 3

1

如果您想完全按照您的描述做,我会说@Cary 的回答很好。

我只是想补充一点,稍微不同的格式可能更容易和更快地使用(前提date是字段是唯一的)。您可以将每个哈希合并在一起:

require 'json'

json_data = %q([
  {
    "2017-04-01 00:00:00 UTC": 100.992226272734
  },
  {
    "2017-03-01 00:00:00 UTC": 3.0594465818934964
  }
])

hashes = JSON.parse(json_data)
date_and_values = hashes.inject(&:merge)
# {"2017-04-01 00:00:00 UTC"=>100.992226272734, "2017-03-01 00:00:00 UTC"=>3.0594465818934964}

所有信息都在这里,但更容易访问:

date_and_values.keys
# ["2017-04-01 00:00:00 UTC", "2017-03-01 00:00:00 UTC"]
date_and_values.values
# [100.992226272734, 3.0594465818934964]
date_and_values["2017-04-01 00:00:00 UTC"]
# 100.992226272734
于 2017-04-11T21:40:49.210 回答
1
require 'json'

假设

arr = [{ "2017-04-01 00:00:00 UTC": 100.992226272734 },
       { "2017-03-01 00:00:00 UTC": 3.0594465818934964 }]

JSON对象(字符串)是

json = arr.to_json
  #=> "[{\"2017-04-01 00:00:00 UTC\":100.992226272734},\
  #     {\"2017-03-01 00:00:00 UTC\":3.0594465818934964}]" 

因此,我们可以将其转换为所需的哈希数组:

JSON.parse(json).map do |g|
  k, v = g.first
  { "date"=> k, "value"=>v }
end
  #=> [{"date"=>"2017-04-01 00:00:00 UTC", "value"=>100.992226272734}, 
  #    {"date"=>"2017-03-01 00:00:00 UTC", "value"=>3.0594465818934964}] 
于 2017-04-11T18:47:17.133 回答
0

只需使用#map并为每个元素创建一个新的哈希。当您想以不同的方式呈现集合中存在的数据时(就像您在问题中所做的那样),地图操作很有用。

original = [
  {
    "2017-04-01 00:00:00 UTC" => 100.992226272734
  },
  {
    "2017-03-01 00:00:00 UTC" => 3.0594465818934964
  },
]

mapped = original.map do |h|
  Hash[%w(date value).zip(h.keys + h.values)]
end

mapped看起来像这样:

[
    {"date" => "2017-04-01 00:00:00 UTC", "value"=>100.992226272734}, 
    {"date" => "2017-03-01 00:00:00 UTC", "value"=>3.0594465818934964}
]

您应该查看Enumerable API以了解在处理类似问题时可以对集合执行哪些其他操作。

于 2017-04-11T18:32:45.867 回答