如何在Ruby on Rails中按优先级查找哈希数组中的指定哈希?
更优雅的实现方式
首先注意一个小细节:你的哈希数组中键是符号(比如:name),但原代码里用了字符串键'name'去取值,这会返回nil,需要修正为符号键来匹配。
针对你的需求(优先匹配name1,找不到再匹配name2,找到即停止),有几种更优雅的实现方式:
方法一:使用Ruby 2.7+的find_map方法
find_map会遍历优先级列表,对每个元素执行块,返回第一个非nil的结果,完美契合你的优先级查找需求:
priority_names = ['name1', 'name2'] found_obj = priority_names.find_map { |name| my_obj.detect { _1[:name] == name } }
这个写法简洁且语义明确,find_map会在找到第一个匹配的对象后立即停止后续查找,符合你的性能要求。
方法二:手动遍历优先级列表(兼容旧Ruby版本)
如果你需要兼容Ruby 2.7之前的版本,可以手动遍历优先级列表,找到匹配项就中断:
found_obj = nil ['name1', 'name2'].each do |name| found_obj = my_obj.detect { _1[:name] == name } break if found_obj end
这种方式逻辑清晰,也能保证优先级和查找效率。
方法三:单次数组遍历优化(大数据量场景)
如果你的数组很大,不想像原代码那样遍历两次数组(第一次找name1,没找到再遍历一次找name2),可以改为单次遍历,同时按优先级匹配:
found_obj = nil my_obj.each do |obj| if obj[:name] == 'name1' found_obj = obj break # 找到最高优先级的直接中断遍历 elsif obj[:name] == 'name2' && found_obj.nil? found_obj = obj # 暂时记录,后续若找到name1会被覆盖 end end
这种方式只遍历数组一次,性能更优,适合处理大数据量的场景。
内容的提问来源于stack exchange,提问作者unnamed_road
相关产品推荐
相关产品推荐

