Ruby问题:如何将含数组值的对象转换为对象数组?
问题分析与解决方案
你的代码问题出在每次遍历values时,都执行result[i] = {}——这会将result[i]之前已有的哈希覆盖成新的空哈希,导致前面处理的fname键值对被后续的lname操作冲掉,最终只保留最后一组数据。
修复后的基础写法
result = [] params["people"].each do |key, values| values.each_with_index do |value, i| # 仅当result[i]未初始化时,才创建新哈希 result[i] ||= {} result[i][key.to_sym] = value end end
Ruby风格的简洁写法
如果想更简洁,可以利用Ruby的数组方法直接转换:
# 提取所有键并转为符号 keys = params["people"].keys.map(&:to_sym) # 将值数组转置(把列转为行) transposed_values = params["people"].values.transpose # 把每组值和键配对成哈希 result = transposed_values.map { |vals| keys.zip(vals).to_h }
两种写法最终都会得到你想要的结果:
[ {fname: 'john', lname: 'doe'}, {fname: 'megan', lname: 'fox'} ]
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

