所以我有一个哈希数组(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,了解在遇到类似问题时可以对集合执行哪些其他操作。