Paris on Rails 2008

Ouverture de session

Commentaires récents

Syndication
Flux XML

Dédoublonner un array... avec hashes.

Dédoublonner un array... avec hashes.
Posté par hoksitan le Vendredi, 15 Février, 2008 - 6:22pm. Débuter avec Rails

Salut,

Si la fonction Array.uniq est bien pratique pour dédoublonner les items d'un array, je cherche comment faire pour supprimer des hashes contenus dans celui-ci :

L'array est construit comme ça :


productor = Hash.new
productor[:id] = record.productor.id
productor[:quantity] = cart_item.quantity
productors += productor

Ce que je cherche à faire, c'est balayer cet array (OK), retirer les hashes dont le productor est déjà présent dans un autre hash, et surtout incrémenter la quantity du premier hash avec celle du hash qu'on supprime. Vous me suivez ?

Exemple :
Les deux hashes suivants :

productor[:id] = 5
productor[:quantity] = 78

productor[:id] = 5
productor[:quantity] = 44

doivent me donner celui-là :

productor[:id] = 5
productor[:quantity] = 122

J'ai regardé les divers fonctions de la classe Array, mais je vois pas trop celles qui peuvent m'être utiles.

J'ai commencé un truc comme ça :


productors.each do |current_prod|
if current_prod[:id] ==

else
end
end

mais ça me plaît pas du tout !

Merci !



[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | envoyer par email ]

Options d'affichage des commentaires
Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder" pour activer vos changements.

Sujet: 
test d'algo
Auteur: 
jasperiel
Date: 
Ven, 15/02/2008 - 20:03

Tiens, ça doit bien faire deux ans que j'ai pas tenté de code kata un peu marrant... Test.

C'est assez étrange comme structure, si elle permet ce genre de fragmentation : moi je verrais plutôt un algo plus complexe à la création / insertion / suppression et bien plus rapide sur le processus.

Par exemple tu ne coupes pas au parcours du tableau, puis tu as des hashes à structure fixe. Saynul ! Tu pourrais aplatir ton productors en tableau de tableaux et le rehasher, mais malheureusement les IDs vont se conflicter. Je ne vois, naïvement, que recréer une nouvelle hash, propre.

Sinon, je vois ça :


class Hash
  def sum(a, b)
    self[a] = (self.has_key? a) ? self[a] + b : b
  end
end


myhash = { }
productors.each {|p| myhash.sum(p[:id], p[:quantity]) }

One-liners concis mais autant de calculs moches que ton idée... =/


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Merci de ta réponse
Auteur: 
hoksitan
Date: 
Lun, 18/02/2008 - 16:56

Merci de ta réponse Jasperiel.

J'ai écrit du code finalement pour éviter d'avoir un array avec des producteurs doublons quand on construit le tableau, ce qui évite d'avoir à le dédoublonner.

Cependant, je mets ton code de côté qui me sera utile un jour.

--------------------------------
Physalis-Création
http://www.physalis-creation.com


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Sujet: 
Pas la peine ^^
Auteur: 
jasperiel
Date: 
Lun, 18/02/2008 - 20:02

> Cependant, je mets ton code de côté qui me sera utile un jour.

Je ne te le souhaite pas ;) C'est du code moche et non optimisé, pour pallier rapido un problème précis.

Mieux vaut placer la business-logic lors des opérations d'update, plus rares que la consultation des données. Et mieux vaut toujours avoir le plus confiance possible dans tes données : tu imagines avoir à tester le cas ou refaire tourner l'algo plusieurs fois par requête ?


[ Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | envoyer par email ]

Nouveaux liens

Sondage
Lorsque je développe avec Ruby on Rails c'est principalement sous:
Linux
37%
Mac OS X
30%
Windows
32%
(Free|Open|Net) BSD
1%
Autre...
1%
Nombre de votes: 374

Qui est en ligne
Il y a actuellement 1 utilisateur et 51 invités en ligne.

railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails
[ Hébergement et ressources techniques gracieusement fournis par la SSLL Nuxos Group ]