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

Ruby中遍历数组时如何高效移除或更新对象?

可以用keep_if把两个操作合并成一次遍历,既完成元素筛选又处理属性修改,代码更简洁高效:

persons.keep_if do |p|
  if p.age > 40
    false
  else
    p.name += "_child" if p.age < 10
    true
  end
end

说明:

  • keep_if会遍历数组中的每个元素,返回true则保留该元素,返回false则移除,刚好替代delete_if的逻辑;
  • 在判断保留的分支里,顺便处理年龄小于10的对象的name属性修改;
  • 相比原来两次遍历数组的写法,这种方式只遍历一次,性能更优,代码也更紧凑。

如果希望生成新数组而不是原地修改原数组,可以用filter_map:

new_persons = persons.filter_map do |p|
  next nil if p.age > 40
  p.name += "_child" if p.age < 10
  p
end

注意:上面的代码会修改原数组中对象的属性,如果需要不改动原对象,可以先复制对象再修改,比如用dup和tap:

new_persons = persons.filter_map do |p|
  next nil if p.age > 40
  p.dup.tap { |dup_p| dup_p.name += "_child" if dup_p.age < 10 }
end

内容的提问来源于stack exchange,提问作者Alon Dor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:12:03