7
votes

Affectation de hachage lorsque (Key => Valeur) sont stockés dans un tableau? (rubis)

J'ai hash (@post) de hachage forte> où je veux conserver l'ordre des clés de hachage dans le tableau (@post_csv_order) et souhaitez également garder la clé de relation => Valeur dans le tableau fort>.

Je ne connais pas le numéro final des hachages @Post et de la clé => éléments de valeur dans le tableau. p>

Je ne sais pas comment attribuer le hash dans une boucle pour tous les éléments de tous les éléments de le tableau. Un par un @post_csv_order [0] [0] => @post_csv_order [0] [1] code> fonctionne bien. P>

#  require 'rubygems'
require 'pp'

@post = {}

forum_id = 123           #only sample values.... to make this sample script work
post_title = "Test post"

@post_csv_order = [
  ["ForumID" , forum_id],
  ["Post title", post_title]  
]

if @post[forum_id] == nil
  @post[forum_id] = {
    @post_csv_order[0][0] => @post_csv_order[0][1],
    @post_csv_order[1][0] => @post_csv_order[1][1]
    #@post_csv_order.map {|element| element[0] => element[1]}
    #@post_csv_order.each_index {|index|        @post_csv_order[index][0] => @post_csv_order[index][1] }
  }
end

pp @post


2 commentaires

Veuillez éditer votre question pour le formater correctement ...


Merci, cela arrive souvent que le formatage n'est pas correct après la soumission. Je dois vérifier ça.


3 Réponses :


1
votes

Je ne suis pas sûr que je comprends bien votre question, mais je suppose que vous souhaitez convertir un tableau 2D dans un hachage.

Supposons que vous ayez un tableau tel que: P>

keys = array.inject([]) {|a,e| a << e[0] }
=> [:foo, :bar, :baz]


4 commentaires

@paradigmatic: Peut-être que vous n'avez peut-être pas compris complètement mais vous avez répondu complètement :-) Tout ce dont j'avais besoin était hash = array.inject ({}) {| H, e | h [e [0]] = E [1]; h} que j'ai changé dans mon exemple de code sur @post [forum_id] = @ post_csv_order.inject ({}) {| H, e | h [e [0]] = E [1]; h} et cela fait exactement je voulais faire. Je vais vérifier dans l'ensemble du script de projet demain. Merci.


L'autre moyen de construire un hachage d'un tableau de tableaux de clé, la valeur des paires est: hachage [* array.flatten]


@Wayne: En effet, il existe un moyen plus facile avec le hasch [], mais l'aplatir n'est pas nécessaire depuis 1,8,7 (et il est en fait dangereux, si l'une de vos clés / valeur est une matrice) Voir ma réponse


@Wayne Conrad: Wow. @post [forum_id] = hachage [* @ post_csv_order.flatten] fonctionne vraiment bien. Merci



5
votes

Le meilleur moyen est d'utiliser to_h : xxx

note : ceci a été introduit dans Ruby 2.1.0. Pour plus vieux rubis, vous pouvez utiliser mon BackPorts gem et exiger 'BackPorts / 2.1 .0 / array / to_h ' ou autre utilisez hachage [] : xxx

Ceci est disponible dans Ruby 1.8.7 et plus tard. Si vous utilisez toujours Ruby 1.8.6, vous pouvez nécessite "BackPorts / 1.8.7 / hachage / constructeur" , mais vous pouvez aussi bien utiliser le to_h BackPort.


6 commentaires

@ Marc-Andre Lafortune: Ça a l'air bien. Quel serait le code dans mon cas? @post [Forum_ID] = @post_csv_order me donne un hachage de tableaux pas hachage de hachage.


Vous avez appelé hash []? Voir ma réponse mise à jour. N'oubliez pas d'exiger des backports si vous utilisez 1.8.6


J'ai essayé @post [forum_id] = hachage [@post_csv_order] et j'ai essayé maintenant @post [forum_id] || = hachage [@post_csv_order] . Les deux me donne nombre impair d'arguments pour hachage (argumentError)


HM, pourquoi avez-vous utilisé || devant =?


Nombre impair d'arguments => Je pense que vous utilisez Ruby 1.8.6? Vous devez nécessiter "BackPorts" à l'avance. || = voir Stackoverflow.com/Questtions/63998/ Caractéristiques cachées-of-Ruby / ...


@ Marc-Andre Lafortune: Tu as raison, ça marche maintenant. Merci de vous.



0
votes

Résultats Résumé

Code de travail # 1 xxx

Code de travail # 2

@post [forum_id] = hachage [* @ post_csv_order.flatten]

Code de travail # 3

@post [forum_id] || = hachage [@post_csv_order] #requires "nécessite" BackPorts " '


0 commentaires