Ruby on Rails数组添加异常:误将非匹配项加入数组求助
问题分析与解决方案
我一眼就看到了两个关键问题导致你的结果不符合预期,咱们一步步拆解解决:
1. 核心错误:推送了整个数组而非单个元素
你在代码里写了ll.push(@listing_data)——这会把整个原始的@listing_data数组添加到ll中,而不是当前遍历到的符合条件的lal元素。哪怕只有一个元素匹配,ll里也会存入完整的@listing_data,后续的ll.uniq也只会保留这一个数组引用,最终输出时展开数组就会显示两个元素,这就是你看到“两个元素都被加入”的原因。
2. 隐藏的大小写匹配问题
你的experience_values里是小写的"expert",但第一个元素的:expertise是大写开头的"Expert"。Ruby的字符串比较是区分大小写的,所以"Expert".include?("expert")会返回false——这意味着你的原始代码其实根本不会选中任何元素,但因为错误推送了整个数组,才导致最终结果里出现两个元素。
修正后的代码方案
方案一:修复你的原始循环写法
experience_values = ["expert"] @listing_data = [ { :image_url => "/images/original/missing.png", :expertise => "Expert", :skills => [ "Default category" ], :id => "d8nVaHWz2oP4ki8ayT9Nog", :given_name => "Ritik", :family_name => "Som", :work_domain => "it ", :languages => "english", :description => "engineer", :location => "" }, { :image_url => "/images/original/missing.png", :expertise => "Beginner", :skills => [ "Default category" ], :id => "mkfVPmAWHbMG6MT8rp_KKw", :given_name => "Ritik", :family_name => "Som", :work_domain => "", :languages => "", :description => "", :location => "" } ] ll = [] @listing_data.each do |lal| experience_values.each do |ee| # 统一转成小写匹配,彻底解决大小写问题 if lal[:expertise].downcase.include?(ee.downcase) ll.push(lal) # 推送当前符合条件的单个元素,而非整个数组 end end end ll = ll.uniq
方案二:Ruby惯用的select写法(推荐)
Ruby的枚举器提供了更简洁的筛选方式,不需要手动循环和push,代码更易读且不易出错:
experience_values = ["expert"] ll = @listing_data.select do |item| # 检查当前元素的expertise是否包含任意一个目标值(忽略大小写) experience_values.any? { |val| item[:expertise].downcase.include?(val.downcase) } end # select会自动返回符合条件的元素数组,若原始数组无重复元素,无需再调用uniq
这样修改后,ll里就只会包含:expertise匹配"expert"的第一个元素了。
内容的提问来源于stack exchange,提问作者Ritik Som
相关产品推荐
相关产品推荐

