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

如何将整数数组映射为键值格式?Ruby代码问题求助

Ruby JSON格式转换问题解决

输入与期望输出

原始JSON

{
    "array": [
        {
            "userId": 1203746,
            "leadContactVids": [
                68310280,
                68310253
            ]
        }
    ]
}

期望目标格式(注:原示例中同一对象重复id键是错误的,以下为修正后的正确格式)

{
    "updatedArray": [
        {
            "userId": 1203746,
            "leadContactVids": [
                {"id": 68310280},
                {"id": 68310253}
            ]
        }
    ]
}

问题代码

updatedArray= array.each do |entry|
    qlIds = entry.dig(:leadContactVids)&.map { |item| {id: item} }
    entry.merge({
      leadContactVids: qlIds
    })
end 

问题分析

  1. each方法误用:each遍历数组时只会返回原数组,不会保留merge后的新哈希,必须用map来生成转换后的新数组。
  2. 键类型不匹配:JSON解析后的哈希默认是字符串键(如"leadContactVids"),而代码中用了符号键:leadContactVids,导致dig返回nil,后续map无法执行。
  3. merge未生效:merge返回新哈希,但原代码没有将这个新哈希作为遍历的返回值(即使each也不会收集),所以原数组元素完全没被修改。

修正后的代码

处理字符串键(JSON解析后的常见情况)

# 假设array是JSON.parse后得到的数组
updated_array = array.map do |entry|
  # 使用字符串键访问,避免dig找不到值
  lead_vids = entry["leadContactVids"]&.map { |vid| { "id" => vid } }
  # 返回合并后的新哈希,map会收集这些哈希组成新数组
  entry.merge("leadContactVids" => lead_vids)
end

# 组装成最终的目标哈希
result_hash = { "updatedArray" => updated_array }

处理符号键(若原数据是符号键哈希)

updated_array = array.map do |entry|
  lead_vids = entry.dig(:leadContactVids)&.map { |vid| { id: vid } }
  entry.merge(leadContactVids: lead_vids)
end

result_hash = { updatedArray: updated_array }

额外说明

原期望示例中把两个id放在同一个对象里是错误的——Ruby哈希(以及JSON对象)不允许重复键,最终只会保留最后一个键值对,所以正确的格式应该是每个id对应一个独立的对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:17:36