2017-08-22 1 views
1

J'ai besoin de trouver la catégorie, dans un tableau, qui détient le "plus grand" poids. Je définis les poids dans une variable d'environnement:Utilisez max_by dans Ruby pour trouver la clé pour le nombre maximum dans un hachage

CATEGORY_WEIGHTS = { 
    "small_standard": 0, 
    "large_standard": 1, 
    "small_oversize": 2, 
    "medium_oversize": 3, 
    "large_oversize": 4 
} 

Dans cet exemple, la catégorie pondérée « plus » serait large_oversize.

Le tableau qui je vérifie ressemble à ceci:

categories = [ 
    "small_oversize", 
    "large_standard", 
    "small_standard", 
    "large_oversize" 
] 

Mais quand je fais cela, il ne retourne pas la valeur correcte:

max_category = categories.max_by{ |cat| CATEGORY_WEIGHTS[cat] } 

Il retourne small_oversize au lieu de large_oversize .

Où est-ce que je me suis égaré?

+0

Dans une déclaration de hachage ' "x": y' devient': x => y'. Pour les clés de chaîne réelles: '" x "=> y'. – tadman

Répondre

4

Vous utilisez des symboles dans le hachage, mais vous essayez d'y accéder avec des chaînes. Changer à:

max_category = categories.max_by{|cat| CATEGORY_WEIGHTS[cat.to_sym]} 

Et voici comment vous pouvez le faire plus simple:

category_weights = { 
    small_standard: 0, 
    large_standard: 1, 
    small_oversize: 2, 
    medium_oversize: 3, 
    large_oversize: 4 
} 

category = category_weights.max_by{|c, w| w}[0] 
+0

Oui, parfait. Je vous remercie! J'accepterai la réponse quand elle me le permettra! – ToddT