Comment analyser un hachage Ruby plat en un hachage imbriqué?


Shpigford

J'ai le hachage Ruby plat suivant:

{ 
  "builder_rule_0_filter"=>"artist_name", 
  "builder_rule_0_operator"=>"contains", 
  "builder_rule_0_value_0"=>"New Found Glory", 

  "builder_rule_1_filter"=>"bpm", 
  "builder_rule_1_operator"=>"less", 
  "builder_rule_1_value_0"=>"150", 

  "builder_rule_2_filter"=>"days_ago", 
  "builder_rule_2_operator"=>"less", 
  "builder_rule_2_value_0"=>"40", 

  "builder_rule_3_filter"=>"release_date_start", 
  "builder_rule_3_operator"=>"between", 
  "builder_rule_3_value_0"=>"2019-01-01", 
  "builder_rule_3_value_1"=>"2019-12-31", 
}

J'aimerais le convertir en un hachage imbriqué un peu plus organisé / utilisable:

{
  "0"=>
    {
      "filter"=>"artist_name",
      "operator"=>"contains",
      "values"=>
      {
        "0"=>"New Found Glory"
      }
    },
  "1"=>
    {
      "filter"=>"bpm",
      "operator"=>"less",
      "values"=>
      {
        "0"=>"150"
      }
    }
  "2"=>
    {
      "filter"=>"days_ago",
      "operator"=>"less",
      "values"=>
      {
        "0"=>"40"
      }
    }
  "3"=>
    {
      "filter"=>"release_date_start",
      "operator"=>"between",
      "values"=>
      {
        "0"=>"2019-01-01"
        "1"=>"2019-12-31"
      }
    }
}

Alors, comment convertir un hachage plat (que j'obtiens à partir d'un formulaire) et le convertir pour qu'il soit imbriqué en fonction de ces noms de clés?

max pleaner

Vous pouvez d'abord diviser le hachage en plusieurs hachages en fonction de leur numéro de préfixe (n'hésitez pas à l'exécuter pour voir la valeur de retour)

groups = input.
  group_by { |k,v| k.match(/builder_rule_(\d+)/)[1] }.
  transform_values(&:to_h)

à ce stade, la création des objets internes est plus facile si vous utilisez simplement un codage en dur pour créer les key-valls:

result = groups.each_with_object({}) do |(prefix, hash), memo|
  memo[prefix] = {
    "filter" => hash["builder_rule_#{prefix}_filter"],
    "operator" => hash["builder_rule_#{prefix}_operator"],
    "values" => hash.select do |key, val|
      key =~ /builder_rule_#{prefix}_value/
    end.sort_by { |key, val| key }.map { |(key, val)| val }
  }
end

Il peut être difficile de savoir ce que cela .sort_by { |key, val| key }.map { |(key, val)| val }signifie. Je peux l'épeler:

  • hash.select { |key, val| key =~ /builder_rule_#{prefix}_value/ }obtient les valeurs-clés qui vont être utilisées pour le tableau "values". Il renvoie un hachage.
  • .sort_by { |key, val| key }transforme le hachage en un tableau de [key, val]tuples, triés par clé. Ceci afin que les valeurs apparaissent dans le bon ordre.
  • .map { |(key, val)| val } transforme le tableau imbriqué en un tableau à un seul niveau, en supprimant les clés

Vous pouvez également utiliser sort_by(&:first).map(&:second), bien que vous ayez besoin d'un soutien actif pour utiliserArray#second

Articles connexes


Ruby: Comment transformer un hachage en paramètres HTTP?

Julien Genestoux C'est assez facile avec un simple hachage comme {:a => "a", :b => "b"} ce qui se traduirait par "a=a&b=b" Mais que faites-vous avec quelque chose de plus complexe comme {:a => "a", :b => ["c", "d", "e"]} qui devrait se traduire par "a=a&b

Comment convertir un objet de hachage ruby en JSON?

kapso Comment convertir un objet de hachage ruby en JSON? Alors j'essaye cet exemple ci-dessous et ça ne marche pas? Je regardais le RubyDoc et évidemment l' Hashobjet n'a pas de to_jsonméthode. Mais je lis des blogs que Rails prend en charge active_record.to_

Ruby comment vérifier une valeur dans un hachage imbriqué?

Daan R. J'ai un hachage imbriqué comme celui-ci où il peut avoir 50 valeurs: { "pool1"=>{"name"=>"my-pool", "partition"=>"Common"}, "pool2"=>{"name"=>"test-2", "partition"=>"baas"} } J'essaye d'obtenir toutes les piscines avec la clé "partition"=>"baas". co

Comment analyser un tableau en un hachage de tableaux?

Jerzy Witwinowski Je suis un débutant (un biologiste de laboratoire humide, qui doit jouer un peu avec la bioinformatique pour la première fois de ma vie) et aujourd'hui je suis coincé sur un problème: comment analyser un tableau en un hachage de tableaux en p

Comment convertir une chaîne en un hachage imbriqué

dya26 J'ai une chaîne foo.bar.bazavec une valeur 'qux' que je veux convertir en hachage imbriqué comme ceci : { foo: { bar: { baz: 'qux' } } } Comment pourrais-je procéder d'une manière qui permettrait différentes longueurs de chaîne ? par e