2017-10-15 2 views
-1

Salut les gars, j'ai de la difficulté à trouver une solution à un problème.Alors j'ai un tableau comme ci-dessous.boucle à travers les hachages et de produire de nouveaux hachage/tableau en ruby ​​sur les rails

{ 
"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" 
    } 
    ] 
} 

Maintenant ce que je veux faire est de produire un tableau comme ci-dessous

{ 
    "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"] 
     ] 
    ... 
} 

et ainsi de suite. J'ai essayé d'itérer sur le tableau en utilisant la méthode .each et .map mais cela n'a pas fonctionné. Je recherche des solutions existantes dans stackoverflow mais rien ne m'aide. Quelqu'un peut-il m'aider avec ceci. Merci beaucoup d'avance.

+0

Remarque: les deux de vos structures sont des aplats. –

+0

"ça n'a pas marché" n'est pas une description d'erreur assez précise pour que nous puissions vous aider. * Qu'est-ce * ne fonctionne pas? * Comment * ça ne marche pas? Quel problème avez-vous avec votre code? Avez-vous un message d'erreur? Quel est le message d'erreur? Est-ce que le résultat que vous obtenez n'est pas le résultat que vous attendez? Quel résultat attendez-vous et pourquoi, quel est le résultat que vous obtenez et comment les deux diffèrent-ils? Est-ce que le comportement que vous observez n'est pas le comportement désiré? Quel est le comportement désiré et pourquoi, quel est le comportement observé, et en quoi diffèrent-ils? –

+0

Pouvez-vous fournir une spécification * précise * de ce que vous voulez faire, y compris toutes les règles, les exceptions de ces règles, les cas de coin, les cas spéciaux, les cas limites et les cas de bordure? Pouvez-vous fournir des exemples d'entrées et de sorties démontrant ce que vous attendez, à la fois dans des cas normaux et dans toutes les exceptions, les cas particuliers, les cas spéciaux, les cas limites et les cas limites? S'il vous plaît, fournissez également un [mcve]. –

Répondre

2

Si vous définissez hash comme l'objet d'origine, vous pouvez le faire avec reduce comme ceci:

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

Vous pouvez aussi le faire avec juste each:

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

Je ne suis pas sûr si vous êtes écrire votre hash comme JSON ou Ruby, mais je n'ai pas eu le temps de le réécrire en Ruby, je l'ai simplement copié dans un script, ce qui fait que toutes les clés sont des symboles.

Je crois que cela devrait fonctionner:

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 

Ce qui me donne ce résultat:

{:"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

Une solution plus de moi :)

Pour 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 

Et fo r plus tôt:

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