基本上我正在尝试编写一个if条件来查看数组的所有内容以判断该条件是否为真。
基本上,我想这样做:
SubScale.all.each do |ss|
if ss.key IN(scales)
execute this code
end
end
如果ss.key是该数组中的任何条目,则数组中的比例并且我希望执行代码。
答案 0 :(得分:5)
您正在寻找Array#include
? :
scales.include?(ss.key)
答案 1 :(得分:4)
比Array#include?
更通用 - 需要您按值检查 - Enumerable#any?
:
SubScale.all.each do |ss|
# Run the code if the value is an exact match
run_code if scales.include?(ss.key)
end
SubScale.all.each do |ss|
# Run the code if the block returns a truthy value
run_code if scales.any?{ |scale| scale.downcase == ss.key.downcase }
end
最后,如果它是你想要的完全匹配,速度结果是一个问题(配置文件优先!),你可以通过使用哈希在O(1)中查找你的密钥来代替O(n)时间:
scale_lookup = Hash[ scales.map{ |s| [s,true] } ]
SubScale.all.each do |ss|
run_code if scale_lookup[ss.key]
end
答案 2 :(得分:1)
scales.include?(ss.key)就是你所需要的。
答案 3 :(得分:0)
如果scales
有很多元素,那么SubScale.all
我会建议创建临时集(或哈希):
require "set"
scales_set = Set.new(scales)
....each do |ss|
if scales_set.include?(ss.key)
...
end
end
这可能会更快。
P.S。哈希似乎比set更快:
scales_hash = scales.inject({}) { |h, e| h[e] = true; h }
....each do |ss|
if scales_hash.has_key?(ss.key)
...
end
end