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

如何在Ruby中循环迭代并构建含嵌套结构的哈希键值对?

解决Ruby哈希内迭代逻辑的问题

你说得没错——Ruby的哈希字面量{}内部确实不能直接嵌入each这类迭代逻辑,因为哈希需要的是明确的键值对结构,而each语句本身是用来执行遍历操作的,不会返回能直接作为哈希内容的键值对集合,这就是你报错的原因。

要生成你需要的JSON结构,我们可以用each_with_object这个方法来逐步构建嵌套哈希,它非常适合这种从集合生成哈希的场景。下面是修正后的代码:

strands = Strand.all
data = {
  "data" => strands.each_with_object({}) do |strand, result_hash|
    # 先构建当前strand的基础哈希
    strand_item = { "description" => strand.description }
    
    # 如果有standards,再添加children字段
    if strand.standards.present?
      strand_item["children"] = strand.standards.each_with_object({}) do |standard, child_hash|
        child_hash[standard.name] = { "description" => standard.description }
      end
    end
    
    # 把当前strand的内容存入结果哈希
    result_hash[strand.name] = strand_item
  end
}

# 如果需要转成JSON字符串,记得先引入json库
# require 'json'
# puts data.to_json

代码解释:

  1. 外层的each_with_object({}):初始化一个空哈希result_hash,遍历所有strand时,把每个strand处理后的键值对存入这个哈希,最后它会直接返回构建好的完整哈希,正好作为"data"对应的值。
  2. strand的基础哈希:先创建包含description的基础结构,再根据是否有standards动态添加children字段。
  3. 内层的each_with_object({}):处理strand下的standards,同样构建以standard名称为键、包含description的哈希集合,作为children的值。

这样写既符合Ruby的语法规则,又能精准生成你需要的JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:38