合并和组合数组中的哈希值
Merge and Combine Hash Values in an Array
我正在构建一个数组,我需要在其中将所有文件路径组合或合并到一个散列中,其中包含两个值。
输入哈希如下所示:
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
并且它只与散列中的一个值一起工作,它产生“Apple_HLS”值内的文件路径。
[["\\workspace1\test-media.m3u8",
"\\workspace1\OTT-1\segment_1.ts"]]
但我需要组合并合并“Apple_HLS_Prev”的值并将其包含在数组输出中。我试过这段代码,它没有合并值,而是显示空白。
编辑:我期待像这样的数组的合并和组合输出:
[["\\workspace1\test-media.m3u8",
"\\workspace1\OTT-1\segment_1.ts",
"\\workspace1\test-media-p.m3u8",
"\\workspace1\OTT-3\test-media-p.m3u8"]]
希望您能回答。谢谢大家!
正如其他人评论的那样,您需要展示您实际期望的输出结果,但我想我明白您在寻找什么。
这是我认为与您的哈希格式匹配的哈希。
my_hash = {key1: [:key1_value1, :key1_value2],key2: [:key2_value1, :key2_value2], key3: [:key3_value1, :key3_value2]}
要合并所有值,只需获取值,这将是一个包含 2 个元素数组的数组,然后将其展平为一个数组。
my_hash.values.flatten
returns:
[:key1_value1, :key1_value2, :key2_value1, :key2_value2, :key3_value1, :key3_value2]
如果你想保留值对,那么就不要将值展平。
my_hash.values
returns:
[[:key1_value1, :key1_value2], [:key2_value1, :key2_value2], [:key3_value1, :key3_value2]]
如果您只想 select 中条目的一个子集,您可以这样做:
my_hash.select {|k,v| [:key1, :key2].include? k}.values.flatten
哪个returns:
[:key1_value1, :key1_value2, :key2_value1, :key2_value2]
以下不起作用的原因是因为如您所见,第一个 select 只有 returns 匹配 'Apple_HLS(Media)' 的条目,第二个 select 应用于结果第一个 select 不再包含 'Apple_HLS_Prev(Media)'
的条目
outputs['output_files'] = inputs['output_files_hash'].select{ |k,v| k == 'Apple_HLS(Media)' }.select{ |k,v| k == 'Apple_HLS_Prev(Media)' }.values
虽然我认为我上面发布的内容(使用数组 include?
方法)更清晰,但您可以通过说密钥应该是 Apple_HLS(Media) OR Apple_HLS_Prev(媒体)
outputs['output_files'] = inputs['output_files_hash'].select{ |k,v| k == 'Apple_HLS(Media)' || k == 'Apple_HLS_Prev(Media)'}.values
但我认为这样更干净:
outputs['output_files'] = inputs['output_files_hash'].select { |k,v| ['Apple_HLS(Media)', 'Apple_HLS_Prev(Media)'].include? k }.values
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"
]
}
[h.map {|k, v| v }.flatten]
#=> [["\\workspace1\test-media.m3u8", "\\workspace1\OTT-1\segment_1.ts", "\\workspace1\test-media-p.m3u8", "\\workspace1\OTT-3\test-media-p.m3u8"]]
我正在构建一个数组,我需要在其中将所有文件路径组合或合并到一个散列中,其中包含两个值。
输入哈希如下所示:
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
并且它只与散列中的一个值一起工作,它产生“Apple_HLS”值内的文件路径。
[["\\workspace1\test-media.m3u8",
"\\workspace1\OTT-1\segment_1.ts"]]
但我需要组合并合并“Apple_HLS_Prev”的值并将其包含在数组输出中。我试过这段代码,它没有合并值,而是显示空白。
编辑:我期待像这样的数组的合并和组合输出:
[["\\workspace1\test-media.m3u8",
"\\workspace1\OTT-1\segment_1.ts",
"\\workspace1\test-media-p.m3u8",
"\\workspace1\OTT-3\test-media-p.m3u8"]]
希望您能回答。谢谢大家!
正如其他人评论的那样,您需要展示您实际期望的输出结果,但我想我明白您在寻找什么。
这是我认为与您的哈希格式匹配的哈希。
my_hash = {key1: [:key1_value1, :key1_value2],key2: [:key2_value1, :key2_value2], key3: [:key3_value1, :key3_value2]}
要合并所有值,只需获取值,这将是一个包含 2 个元素数组的数组,然后将其展平为一个数组。
my_hash.values.flatten
returns:
[:key1_value1, :key1_value2, :key2_value1, :key2_value2, :key3_value1, :key3_value2]
如果你想保留值对,那么就不要将值展平。
my_hash.values
returns:
[[:key1_value1, :key1_value2], [:key2_value1, :key2_value2], [:key3_value1, :key3_value2]]
如果您只想 select 中条目的一个子集,您可以这样做:
my_hash.select {|k,v| [:key1, :key2].include? k}.values.flatten
哪个returns:
[:key1_value1, :key1_value2, :key2_value1, :key2_value2]
以下不起作用的原因是因为如您所见,第一个 select 只有 returns 匹配 'Apple_HLS(Media)' 的条目,第二个 select 应用于结果第一个 select 不再包含 'Apple_HLS_Prev(Media)'
的条目outputs['output_files'] = inputs['output_files_hash'].select{ |k,v| k == 'Apple_HLS(Media)' }.select{ |k,v| k == 'Apple_HLS_Prev(Media)' }.values
虽然我认为我上面发布的内容(使用数组 include?
方法)更清晰,但您可以通过说密钥应该是 Apple_HLS(Media) OR Apple_HLS_Prev(媒体)
outputs['output_files'] = inputs['output_files_hash'].select{ |k,v| k == 'Apple_HLS(Media)' || k == 'Apple_HLS_Prev(Media)'}.values
但我认为这样更干净:
outputs['output_files'] = inputs['output_files_hash'].select { |k,v| ['Apple_HLS(Media)', 'Apple_HLS_Prev(Media)'].include? k }.values
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"
]
}
[h.map {|k, v| v }.flatten]
#=> [["\\workspace1\test-media.m3u8", "\\workspace1\OTT-1\segment_1.ts", "\\workspace1\test-media-p.m3u8", "\\workspace1\OTT-3\test-media-p.m3u8"]]