2017-10-15 4 views
-1

こんにちは、私は問題の解決策を見つけるのに苦労しています。私は蛇腹のような配列を持っています。ruby​​でループをハッシュして、新しいハッシュ/アレイを生成する

{ 
"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メソッドを使って配列を繰り返し処理しようとしましたが、それはうまくいきませんでした。 これを手伝ってくれる人がいますか? ありがとうございます。あなたは、元のオブジェクトとしてhashを定義した場合

+0

注:どちらの構造もハッシュです。 –

+0

「うまくいかない」とは、私たちがあなたを助けるほど正確なエラー記述ではありません。 *何がうまくいかない? *どのように動作しませんか?あなたのコードにはどんな問題がありますか?エラーメッセージが表示されますか?エラーメッセージとは何ですか?結果はあなたが期待している結果を得ていないのですか?あなたはどんな結果を期待していますか、そしてなぜ、あなたはどのような結果を得ていますか、そしてその二つの違いは何ですか?あなたが観察している行動は、望ましい行動ではありませんか?望ましい行動とは何か、なぜ行動が観察され、どのように違うのですか? –

+0

これらのルール、コーナーケース、特殊ケース、境界ケース、エッジケースからの例外を含む、すべてのルールを含めて、実行したいことを*正確に指定できますか?通常のケースと例外、コーナーケース、特殊ケース、境界ケース、エッジケースの両方で、起こりそうなことを示すサンプル入力と出力を提供できますか?また、[mcve]を提供してください。 –

答えて

2

あなたはとてもよう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に書き直す時間がありませんでした。スクリプトにコピーしてコピーするだけで、すべてのキーがシンボルになりました。

は、私は、これが作業しなければならないと考えている。

{:"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については

私にこの結果を与える

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 

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 
関連する問題