我有一个对象数组,我需要检查它是否符合特定条件。
我已完成的操作循环遍历数组,然后将其与ruby include?
对象进行匹配。问题是我注意到有些情况会导致某些代码返回true,而实际应该返回false。
group.plan_codes.each do |code|
normalized_plan_code = code.upcase.gsub(" ", "").gsub("+", "")
normalized_plan_code.include? coverage['plan_description'].upcase.gsub(" ", "").gsub("+", "")
end
我基本上采用这些group.plan_codes
并将其与coverage['plan_description']
匹配。我发现的问题是,如果代码类似于group plan
,提交类似not group plan
的代码仍会返回true,因为group plan
plan description
有人会知道更好的方法吗?我认为它可能会停止照顾第一个元素完成,但我有点陷入红宝石detect
答案 0 :(得分:2)
使用Regex
或直接相等测试(==
)。为了清楚起见,让我们假设(我正确地理解你的问题)你有一个数组,如:
plans = [ 'not group plan', 'group plan' ]
并且您正在尝试找到第二个元素:
including = 'group plan'
plans.detect { |plan| plan.include?(including) }
这会返回第一个元素“not group plan”,因为它还包含字符串'group plan'。为了解决这个问题,使用正则表达式可以使用以下内容:
plans.detect { |plan| plan.match?(/\A#{Regexp.escape(including)}\z/) }
现在,这将返回第二个元素,因为您正在寻找完全匹配。既然它完全匹配,你也可以使用更简单的东西:
plans.detect { |plan| plan == including }
正则表达式给你的是每个计划是否可以包含多个项目:
plans = ['plan a,not group plan,plan b', 'plan a,group plan,plan b']
这是一个逗号分隔的计划代码列表,您正在寻找包含“群组计划”的任何计划,现在您可以使用正则表达式:
plans.detect { |plan| plan.match?(/,#{Regexp.escape(including)},/) }
并返回第二个元素。您需要将正则表达式用于一种适用于保存计划代码的格式(在此示例中,我选择了逗号分隔列表,您可能使用制表符或分号或其他任何内容。如果您只有一个空格分隔可以包含空格的代码列表,您需要执行更多工作,reject
任何包含更长代码并包含您正在寻找的代码的项目。