合并和组合数组中的哈希值

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"]]