我有一个充满哈希的数组。数据结构如下:
students = [
{
"first_name" => "James",
"last_name" => "Sullivan",
"age" => 20,
"study_results" => {"CAR" => 1, "PR1" => 1, "MA1" => 1, "BEN" => 2, "SDP" => nil}
}
]
我想从至少两个科目中找到标有1
的学生。
我试图将带有标记的哈希转换为数组,然后使用inject
方法对1
的数量进行计数,并找出数字是否为> 1
:
students.select{|student
(
(student["study_results"].to_a)
.inject(0){|sum, x| sum += 1 if x.include?(1)}
) > 1
}
有什么方法可以将条件放入方法中,还是应该找到其他解决方法?
答案 0 :(得分:0)
我赞扬您在发布之前尝试解决此问题,但是您使它不必要地复杂。我会这样写:
students.select{|student| student['study_results'].values.count(1) >= 2}
仅此而已,不需要inject
。您在这里滥用它。
Ruby集合具有大量有用的方法。如果您发现自己使用的是inject
或each
,那么有90%的情况会找到更好的方法。
student['study_results'] # => {"CAR"=>1, "PR1"=>1, "MA1"=>1, "BEN"=>2, "SDP"=>nil}
student['study_results'].values # => [1, 1, 1, 2, nil]
student['study_results'].values.count(1) # => 3
student['study_results'].values.count(2) # => 1
student['study_results'].values.count(3) # => 0
student['study_results'].values.count(nil) # => 1