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

Ruby嵌套哈希高效取值:如何通过可变listing_id获取result_api值

Ruby嵌套哈希高效取值:根据listing_id获取result_api

嘿,刚好碰到过类似的场景,给你分享几个实用的方法,按需选择就行:

1. 单次查询:直接遍历查找

如果只是偶尔查一次,用find方法直接定位最直观,代码简洁:

# 你的原始数据
data = {"0"=>{"result_api"=>15229, "listing_id"=>4}, "1"=>{"result_api"=>15229, "listing_id"=>2}, "2"=>{"result_api"=>15229, "listing_id"=>1}}

# 假设你的目标listing_id是变量
target_id = 2

# 查找匹配项并提取result_api,&.避免找不到时出现NoMethodError
result_api = data.values.find { |item| item["listing_id"] == target_id }&.[]("result_api")
# 输出:15229

这里data.values先取出所有内层哈希,find会返回第一个匹配的哈希,&.[]是安全导航操作符,确保如果没有找到匹配项时不会报错,而是返回nil。

2. 多次查询:预处理成反向哈希(最优效率)

如果需要反复根据listing_id查询,预处理一次生成以listing_id为键的哈希是最高效的方式,后续查询都是O(1)时间复杂度:

# 只需要预处理一次
lookup_map = data.values.each_with_object({}) do |item, map|
  map[item["listing_id"]] = item["result_api"]
end

# 后续每次查询直接取值就行
target_id = 1
result_api = lookup_map[target_id]
# 输出:15229

这个方法把原始数据转换成了{4=>15229, 2=>15229, 1=>15229}这样的结构,查起来特别快,适合频繁查询的场景。

3. 处理重复listing_id:返回所有匹配结果

如果你的数据中可能存在多个相同的listing_id,用select代替find可以拿到所有匹配项:

target_id = 15229 # 假设这个id有多个匹配
matching_results = data.values.select { |item| item["listing_id"] == target_id }.map { |item| item["result_api"] }
# 返回所有匹配的result_api数组

小提示

  • 如果你用的是Ruby 2.3之前的版本,没有&.安全导航符,可以用try或者手动判断nil:
    item = data.values.find { |item| item["listing_id"] == target_id }
    result_api = item["result_api"] if item
    
  • 确保listing_id的类型和你变量的类型一致(比如都是整数,不要一个是整数一个是字符串),否则会匹配不到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:49:04