2017-04-11 50 views
-1
2新價值

,所以我有這個樣子地圖鍵和值在哈希與靜態密鑰

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

散列(JSON格式)的陣列,現在我要地圖每個鍵與新價值它來了個同樣的方式與價值的靜態關鍵日期:,,每個值都有新的靜態密鑰值:,我的意思是這些散列現在的樣子:

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

誰能幫助我的節目做的最好的辦法那?

+0

請閱讀「[問]」包括鏈接的網頁,「[MCVE ]「和」[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/questions/261592)「。我們希望看到你的努力的證據。你嘗試了什麼?你搜索並沒有找到任何東西?你有沒有找到東西,但它沒有幫助?你有沒有嘗試寫代碼?如果不是,爲什麼?如果是這樣,那麼最小的代碼示例顯示了您嘗試的內容以及它爲什麼不起作用?沒有它,看起來你沒有嘗試並希望我們爲你寫信。 –

回答

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,看看有什麼其他的操作,你可以在類似的問題上負責執行的集合。

+1

請注意,由於您在Ruby哈希上使用JSON表示法,因此這些鍵會自動轉換爲符號。你應該使用hashrockets('=>')來獲得正確的輸出。 – max

+1

你的塊的身體似乎既過分聰明,不必要的冗長。爲什麼不'd,v = h.first; {「date」=> d,「value」=> v}'? https://repl.it/HFdC –

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

OP說他們的數據是JSON格式,所以'to_s'可能不是必需的。 –

+0

@Jordan,「JSON」格式是什麼意思?如果OP顯示的對象是一個數組,我會認爲它是通過解析JSON字符串而獲得的,這一事實是無關緊要的。如果它是一個字符串,爲什麼它不包含在單引號中?如果您懷疑我對JSON不太瞭解,那麼您是正確的。 –

+1

指示「json格式」的OP導致我猜測隨後的代碼塊包含JSON序列化的數據(包含JSON對象的JSON數組,具體而言),而不是Ruby代碼。我可能是錯的。但是,如果我不是,而且它是JSON而不是Ruby代碼,那麼調用'JSON.parse(text)',其中'text'是一個包含該JSON的字符串將產生一個包含帶有字符串鍵的哈希而不是符號鍵的Ruby數組。但是,我再次犯錯了。 –

1

如果我想說,我想要完成你所描述的內容那@Cary's answer工作得很好。

我只是想補充一點,稍微不同的格式可能會更容易和更快速地使用(假設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 
+1

要消除獨特日期的需求,請考慮製作浮點數值數組。 –

+0

好主意,會做! –

相關問題