Ruby如何按关键词条件删除数组中符合要求的哈希元素
你原有代码的问题
- 键类型不匹配:示例数据的哈希键为字符串类型(如
"text"、"title"),但你使用了符号键:text、:title取值,二者在Ruby中不相等,无法正常读取字段值,导致判断失效。 - 匹配逻辑容错性低:按空格拆分字符串匹配违禁词的方式,遇到违禁词前后带标点、特殊字符的场景就会匹配失败,不需要拆分字符串,直接判断整段文本是否包含违禁词即可。
- 条件逻辑错误:
select需要布尔返回值判断元素是否保留,你嵌套使用select返回的是数组,只要数组非空就会被判定为真,逻辑完全不符合需求。- 你需要的逻辑是「text或title出现任意违禁词就删除」,对应保留条件为「text和title都没有任何违禁词」,原有代码的否定位置、
||运算符使用都不符合逻辑。
- 违禁词数组存在重复值,会做无用的重复判断。
正确实现
使用reject方法更贴合「删除符合条件元素」的需求,代码如下:
# 先对违禁词去重,提高匹配效率 BANNED_WORDS = ['Hacked', 'hack', 'fraud', 'hacked'].uniq filtered_result = data.reject do |item| # 只要text或title包含任意一个违禁词,就剔除当前元素 BANNED_WORDS.any? { |word| item["text"].include?(word) || item["title"].include?(word) } end
如果需要忽略大小写匹配(比如同时匹配Hack、hACK等写法),可以改成如下版本:
# 统一转小写存储,避免重复判断大小写 BANNED_WORDS = ['hacked', 'hack', 'fraud'].uniq filtered_result = data.reject do |item| BANNED_WORDS.any? do |word| item["text"].downcase.include?(word) || item["title"].downcase.include?(word) end end
内容的提问来源于stack exchange,提问作者qaseun
相关产品推荐
相关产品推荐

