如何使用each do遍历嵌套数组check_programs并判断是否包含btest?
Ruby遍历数组检查用户名逻辑实现
你需要遍历check_programs数组(每个元素包含program_enrollments子数组),检查是否存在username包含"btest"的项,并用each do实现逻辑。原代码硬指定索引(check_programs[1]、program_enrollments[0])只能检查固定位置的元素,无法覆盖所有情况,以下是基于each do的实现方案:
基于嵌套each do的实现
# 初始化标记,默认未找到匹配项 has_btest = false # 遍历check_programs中的每个program对象 check_programs.each do |program| # 遍历当前program的所有program_enrollments项 program.program_enrollments.each do |enrollment| if enrollment.username.include?("btest") has_btest = true break # 找到匹配项后跳出内层遍历,避免无效循环 end end break if has_btest # 外层遍历也提前终止,提升效率 end # 根据检查结果设置状态 current_enrollment.status = has_btest ? "accepted" : "pending"
代码说明
- 用
has_btest变量记录是否存在符合条件的用户名 - 外层
each do遍历check_programs的所有元素 - 内层
each do遍历每个元素对应的program_enrollments子数组,逐个校验username - 一旦找到匹配项,立即终止内外层遍历,避免不必要的计算
- 最后通过三元运算符简化原有的if-elsif逻辑,直接赋值状态
更简洁的替代方案(基于any?方法)
如果不需要显式用each do写遍历逻辑,Ruby的any?方法可以更简洁地实现需求(内部本质也是遍历):
# 检查是否存在符合条件的username has_btest = check_programs.any? do |program| program.program_enrollments.any? { |enrollment| enrollment.username.include?("btest") } end current_enrollment.status = has_btest ? "accepted" : "pending"
any?会遍历数组,只要有一个元素满足条件就返回true,写法更紧凑,适合这类存在性检查场景。
内容的提问来源于stack exchange,提问作者Harshitha
相关产品推荐
相关产品推荐

