使用静态键将哈希中的键和值映射到 2 个新值



所以我有一个哈希数组(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
}
]

谁能帮我展示最好的方法?

如果你想完全按照你的描述去做,我会说@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
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}] 

只需使用 #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}
]

应浏览可枚举 API,了解在遇到类似问题时可以对集合执行哪些其他操作。

最新更新