哈希示例输入数组(具有一些规则和不规则的重复模式):
[{ key1 => value1 }, { key2 => value2 }, { key3 => value3 },
{ key4 => value4 }, { key3 => value5 }, { key4 => value6 },
{ key1 => value7 }, { key2 => value8 }, { key3 => value9 },
{ key4 => value10 }, { key3 => value11 }, { key4 => value12 }, { key3 => value13 }, { key4 => value14 },
{ key1 => value15 }, { key2 => value16 }, { key3 => value17 }, { key4 => value18 } ]
要求是将上述内容转换为:
[ [{ key1 => value1 }, { key2 => value2 },
{ key3key4 => value3value4value5value6 } ]
[ { key1 => value7 }, { key2 => value8 },
{ key3key4 => value9value10value11value12value13value14 }]
[ { key1 => value15 }, { key2 => value16 }, { key3key4 => value17value18 }] ]
(注意,例如,key3key4和value5value6value7value8等,只是键和值的连接)
输入结构可以是任意数量的重复哈希值,其中key3和key4不规则地出现,有时只有两个哈希值,有时只有3个等等。
我理解array.each和array.map等,我认为要实现上述目标,可能需要使用计数器或类似工具,但到目前为止,我的努力很快就陷入了混乱,因此在这里张贴一些建议如何最好地解决这个问题。
编辑:更多的理由,key3和key4(以及它们的值)被连接起来,因为它们是模式的每个循环中哈希重复(不规则地)的键,并且希望将其折叠成一个键:输出中模式的每个'repeat'中的值对散列。值是实际问题中的字符串,当它们连接时是有意义的
答案 0 :(得分:2)
如果哈希在所有key3
和key4
之后重复,那么key1
将始终是第一个键,因此我们可以在数组上使用它和slice_before
方法将数组拆分为适当的分组:
output = input.slice_before { |hash| hash.has_key?('key1') }
如果分组的条件不像'始终以key1
开头那样简单,则当第一个包含连接的2个相邻哈希值发生时,可以使用slice_when
分割组 - 能够成功,而第二个没有:
output = input.slice_when do |current_hash, next_hash|
concatenate_keys.any? { |key| current_hash.has_key?(key) } &&
concatenate_keys.none? { |key| next_hash.has_key?(key) }
end
从那里开始,我们只需要将所有key3
和key4
哈希值合并到一个哈希中,我们可以使用map
,select
和{ {3}}:
concatenate_keys = %w[key3 key4]
contains_concatenate_key = -> hash { concatenate_keys.any? { |key| hash.has_key?(key) } }
output = output.map do |grouping|
concatenatable_hashes = grouping.select &contains_concatenate_key
grouping.reject(&contains_concatenate_key) + [
{ concatenate_keys.join => concatenatable_hashes.flat_map(&:values).join }
]
end
p output
# => [[{"key1"=>"value1"}, {"key2"=>"value2"}, {"key3key4"=>"value3value4value5value6"}],
# [{"key1"=>"value7"}, {"key2"=>"value8"}, {"key3key4"=>"value9value10value11value12value13value14"}],
# [{"key1"=>"value15"}, {"key2"=>"value16"}, {"key3key4"=>"value17value18"}]]