2017-10-15 43 views
-1

嗨,大家好我有麻煩找出問題的解決方案。所以我有一個像波紋管的數組。通過哈希循環,並在軌道上的紅寶石產生新的散列/數組

{ 
"9": [ 
    { 
     "id": "9", 
     "day": "2017-08-02", 
     "voltage": "3397.1" 
    }, 
    { 
     "id": "9", 
     "day": "2017-08-01", 
     "voltage": "11518.67" 
    }, 
    { 
     "id": "9", 
     "day": "2017-07-31", 
     "voltage": "12835.5900000002" 
    } 
], 
"11": [ 
    { 
     "id": "11", 
     "day": "2017-08-02", 
     "voltage": "910.21" 
    }, 
    { 
     "id": "11", 
     "day": "2017-08-01", 
     "voltage": "3616.43" 
    }, 
    { 
     "id": "11", 
     "day": "2017-07-31", 
     "voltage": "2085.37" 
    } 
], 
"12": [ 
    { 
     "id": "12", 
     "day": "2017-08-02", 
     "voltage": "4793.96" 
    }, 
    { 
     "id": "12", 
     "day": "2017-08-01", 
     "voltage": "17762.2999999998" 
    }, 
    { 
     "id": "12", 
     "day": "2017-07-31", 
     "voltage": "18334.4000000001" 
    } 
    ] 
} 

現在我想要做的是產生一個數組像下面

{ 
    "9": [ 
      "day": ["2017-08-02", "2017-08-01", "2017-07-31"], 
      "voltage": ["3397.1", "11518.67", "12835.5900000002"] 
     ], 
    "11": [ 
      "day": ["2017-08-02","2017-08-01", "2017-07-31"] 
      "voltage": ["910.21", "3616.43", "2085.37"] 
     ] 
    ... 
} 

等。 我試圖遍歷數組使用.each.map方法,但它沒有工作。我搜索槽現有的解決方案在stackoverflow但沒有什麼幫助我。 有人可以幫助我。 非常感謝。

+0

注意:你的兩個結構都是散列。 –

+0

「它沒有工作」對於我們來說並不是一個足夠準確的錯誤描述來幫助你。 *什麼*不起作用? *如何*不起作用?你的代碼有什麼問題?你有錯誤信息嗎?什麼是錯誤信息?你得到的結果不是你期待的結果嗎?你期望得到什麼結果?爲什麼?你得到的結果是什麼?兩者有什麼不同?你正在觀察的行爲不是所期望的行爲?什麼是期望的行爲,爲什麼,觀察到的行爲是什麼,以及它們以何種方式不同? –

+0

你能提供一個你想要發生什麼的*精確的*規範,包括任何和所有的規則,這些規則的異常,角落情況,特殊情況,邊界情況和邊緣情況?您是否可以提供示例輸入和輸出,以顯示您在正常情況下以及所有例外情況,角落情況,特殊情況,邊界情況和邊緣情況下預期會發生的情況?請同時提供[mcve]。 –

回答

2

如果定義hash作爲原始對象,你可以用reduce做到像這樣:

result = hash.reduce({}) do |memo, (key, vals)| 
    memo[key] = { 
    "day" => vals.map { |val| val[:day] }, 
    "voltage" => vals.map { |val| val[:voltage] } 
    } 
    memo 
end 

您也可以只each做到這一點:

result = {} 
hash.each do |key, vals| 
    result[key] = { 
    "day" => vals.map { |val| val[:day] }, 
    "voltage" => vals.map { |val| val[:voltage] } 
    } 
end 
0

我,如果你不確定把你的散列寫成JSON或Ruby,但我沒有時間將它重寫到Ruby,我只是將它複製粘貼到腳本中,這使得所有的鍵都成爲了符號。

我相信這應該是工作:

new_hash = {} 
current_hash.each do |key, value_array| 
    new_hash[key] ||= {} 

    value_array.each do |values| 
    new_values = values.dup 
    new_values.delete(:id) 

    new_values.each do |attribute_name, attribute_value| 
     new_hash[key][attribute_name] ||= [] 
     new_hash[key][attribute_name] << attribute_value 
    end 
    end 
end 

,給了我這樣的結果:

{:"9"=>{:day=>["2017-08-02", "2017-08-01", "2017-07-31"], :voltage=>["3397.1", "11518.67", "12835.5900000002"]}, :"11"=>{:day=>["2017-08-02", "2017-08-01", "2017-07-31"], :voltage=>["910.21", "3616.43", "2085.37"]}, :"12"=>{:day=>["2017-08-02", "2017-08-01", "2017-07-31"], :voltage=>["4793.96", "17762.2999999998", "18334.4000000001"]}} 
0

從我一個解決方案:)

對Ruby 2.4.0:

hash.transform_values do |values| 
    values.each_with_object({}) do |value, memo| 
    memo[:day] ? memo[:day] << value[:day] : memo[:day] = [value[:day]] 
    memo[:voltage] ? memo[:voltage] << value[:voltage] : memo[:voltage] = [value[:voltage]] 
    end 
end 

而fo r早些時候:

hash.map do |key, values| 
    [ 
    key, 
    values.each_with_object({}) do |value, memo| 
     memo[:day] ? memo[:day] << value[:day] : memo[:day] = [value[:day]] 
     memo[:voltage] ? memo[:voltage] << value[:voltage] : memo[:voltage] = [value[:voltage]] 
    end 
    ] 
end.to_h