在不使用include的情况下在数组中查找元素?

时间:2018-01-19 20:41:00

标签: ruby-on-rails arrays ruby

我有一个对象数组,我需要检查它是否符合特定条件。

我已完成的操作循环遍历数组,然后将其与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

1 个答案:

答案 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任何包含更长代码并包含您正在寻找的代码的项目。