You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:46:25