如何将整数数组映射为键值格式?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
问题分析
each方法误用:each遍历数组时只会返回原数组,不会保留merge后的新哈希,必须用map来生成转换后的新数组。- 键类型不匹配:JSON解析后的哈希默认是字符串键(如
"leadContactVids"),而代码中用了符号键:leadContactVids,导致dig返回nil,后续map无法执行。 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
相关产品推荐
相关产品推荐

