J'ai ce tableau de hachage: Comment puis-je rechercher les résultats pour trouver le nombre d'appels facturés sur le 15? p> Après avoir lu les réponses à " Ruby Easy Search pour la valeur de la clé Paire dans un tableau de hachage ", je pense que cela pourrait impliquer l'expansion de la déclaration suivante: P> results.find { |h| h['day'] == '2012-08-15' }['calls']
5 Réponses :
une implémentation vraiment maladroite;)
def get_calls(hash,name,date)
hash.map{|result| result['calls'].to_i if result['day'] == date && result["name"] == name}.compact.reduce(:+)
end
date = "2012-08-15"
name = "Bill"
puts get_calls(results, name, date)
=> 8
Vous pouvez utiliser @ arun32 version si vous êtes sûr que vous n'avez qu'un seul enregistrement par combinaison
Je n'ai qu'un seul disque par combo. Merci.
Vous êtes sur la bonne voie!
J'avais essayé une virgule là-bas auparavant, mais votre et i> fonctionne parfaitement! Merci beaucoup.
@ S2T2 Vous pouvez également utiliser && code> instad si et code>
results.select { |h| h['day'] == '2012-08-15' && h['name'] == 'Bill' }
.reduce(0) { |res,h| res += h['calls'].to_i } #=> 8
En réalité, "réduire" ou "injject" est spécifiquement pour cette opération exacte (pour réduire le contenu d'une diminution d'une valeur unique en une valeur unique:
results.reduce(0) do |count, value| count + ( value["name"]=="Bill" && value["day"] == "2012-08-15" ? value["calls"].to_i : 0) end
ou une autre manière possible, mais un peu pire, en utilisant injecter: Notez que vous devez définir numéros_of_calls dans chaque itération, sinon cela ne fonctionnera pas, par exemple cela ne fonctionne pas. : p>