Ruby中合并哈希内指定键对应数组元素的技术咨询
如何合并Ruby哈希中指定两个键对应的数组值?
问题描述
我正在构建一个数组,需要合并哈希中两个键对应的所有文件路径。输入哈希如下:
h = { "Apple_HLS(Media)"=>[ "\\\\workspace1\\test-media.m3u8", "\\\\workspace1\\OTT-1\\segment_1.ts" ], "Apple_HLS_Prev(Media)"=>[ "\\\\workspace1\\test-media-p.m3u8", "\\\\workspace1\\OTT-3\\test-media-p.m3u8" ] }
我尝试了以下代码,只能获取单个键对应的值:
outputs['output_files'] = inputs['output_files_hash']. select{ |k,v| k == 'Apple_HLS(Media)' }. values
输出结果为:
[[ "\\\\workspace1\\test-media.m3u8", "\\\\workspace1\\OTT-1\\segment_1.ts" ]]
但我需要将"Apple_HLS_Prev(Media)"对应的值也合并到输出数组中,期望得到的格式是:
[[ "\\\\workspace1\\test-media.m3u8", "\\\\workspace1\\OTT-1\\segment_1.ts", "\\\\workspace1\\test-media-p.m3u8", "\\\\workspace1\\OTT-3\\test-media-p.m3u8" ]]
解决方案
这里有两种简单的方法可以实现你的需求:
方法1:使用values_at + flatten
values_at可以一次性获取多个键对应的值,再用flatten把嵌套数组合并成一维数组,最后包裹一层数组匹配你想要的格式:
# 假设你的哈希是inputs['output_files_hash'] target_keys = ["Apple_HLS(Media)", "Apple_HLS_Prev(Media)"] # 获取两个键的数组值,合并成一维数组 merged_files = inputs['output_files_hash'].values_at(*target_keys).flatten # 外层包裹数组得到目标格式 outputs['output_files'] = [merged_files]
方法2:使用select + values + flatten
如果你更习惯用select筛选键,可以先指定目标键列表,筛选出对应键值对后提取值并合并:
target_keys = ["Apple_HLS(Media)", "Apple_HLS_Prev(Media)"] # 筛选出目标键的键值对,提取值后合并 merged_files = inputs['output_files_hash'].select { |k| target_keys.include?(k) }.values.flatten outputs['output_files'] = [merged_files]
为什么之前的代码没生效?
你之前的select只匹配了单个键,所以values返回的是包含单个数组的嵌套数组。现在我们扩展了筛选的键范围,再通过flatten把多个数组合并成一个,最后包裹一层数组就完全符合你的预期输出了。
内容的提问来源于stack exchange,提问作者rency0722
相关产品推荐
相关产品推荐

