Ruby技术问询:如何将数组中所有哈希的值转换为数组?
解决方案:批量转换数组中哈希的所有值为数组
Hey there! 我明白你的需求啦——要把数组里每个哈希的所有值都转成数组格式,其中逗号分隔的字符串要拆分成多元素数组,还不能硬编码键名对吧?这其实用Ruby的哈希和数组方法就能轻松搞定,我给你一步步讲:
核心思路
我们需要做两件事:
- 遍历数组里的每一个哈希
- 对每个哈希的所有键值对做处理:
- 如果值是逗号分隔的字符串,就分割成数组元素
- 其他值直接包装成单元素数组
代码实现
首先定义一个处理单个哈希的逻辑,然后用map方法把这个逻辑应用到整个数组的每个元素上:
# 你的原始数据 data = [ {:status=>"new", :number=>"215", :subject=>"25", :case=>"First", :attachment=>"alpha, beta"}, {:status=>"old", :number=>"213", :subject=>"21", :case=>"Second", :attachment=>"alpha, beta"} ] # 定义处理单个哈希的lambda transform_single_hash = lambda do |hash| hash.transform_values do |value| # 判断是否是逗号分隔的字符串,是的话分割成数组,否则包装成单元素数组 if value.is_a?(String) && value.include?(',') value.split(/,\s*/).map(&:strip) # 分割后自动去掉元素前后的空格 else [value] end end end # 应用到整个数组 transformed_data = data.map(&transform_single_hash)
效果验证
运行这段代码后,transformed_data的结果就是你想要的:
[ {:status=>["new"], :number=>["215"], :subject=>["25"], :case=>["First"], :attachment=>["alpha", "beta"]}, {:status=>["old"], :number=>["213"], :subject=>["21"], :case=>["Second"], :attachment=>["alpha", "beta"]} ]
额外说明
- 这个方法不需要指定任何固定键名,不管你的哈希里新增或减少什么键,都会自动处理所有值,完全符合你的需求。
- 如果你的多值字符串有其他分隔符(比如分号),只需要把
split(/,\s*/)里的正则改成对应的分隔符即可,比如split(/;\s*/)。
内容的提问来源于stack exchange,提问作者McPie
相关产品推荐
相关产品推荐

