如何将多层嵌套数组中的哈希结构转换为单一哈希表?
解决Ruby多层嵌套数组转单一哈希的问题
针对你提供的多层嵌套数组结构,我们可以通过以下步骤将其转换为单一哈希表,且保留每个键第一次出现的对应值:
实现思路
- 扁平化嵌套数组:将深度嵌套的数组展开为一维数组,提取所有单个键的哈希表。
- 合并哈希表:遍历扁平化后的哈希列表,将键值对合并到结果哈希中,重复键仅保留第一次出现的值。
代码实现
步骤1:定义输入的嵌套数组
nested_array = [[[[[[[[[[[[[[[{:W31=>0.1e1}, {:W31=>0.3e1}], {:W32=>0.1e1}], {:W32=>0.3e1}], {:W33=>0.1e1}], {:W33=>0.3e1}], {:W34=>0.1e1}], {:W34=>0.3e1}], {:W35=>0.5e1}], {:W35=>0.5e1}], {:W36=>0.4e1}], {:W36=>0.6e1}], {:W37=>0.1e1}], {:W37=>0.61e2}], {:W38=>0.1e1}], {:W38=>0.6e1}]
步骤2:扁平化数组
使用Ruby的flatten方法一键展开所有嵌套层级:
flat_hashes = nested_array.flatten # 输出结果:[{:W31=>0.1e1}, {:W31=>0.3e1}, {:W32=>0.1e1}, {:W32=>0.3e1}, ...]
步骤3:合并为单一哈希
方法一:使用inject合并(保留首次出现的键值)
result = flat_hashes.inject({}) do |acc, hash| acc.merge(hash) { |key, old_val, new_val| old_val } end
- 解释:
merge方法的块参数指定当键冲突时,保留原有的值(old_val),即第一次出现的键值对不会被后续重复键覆盖。
方法二:使用each_with_object(更直观)
由于每个子哈希仅包含一个键,我们可以直接判断键是否已存在:
result = flat_hashes.each_with_object({}) do |hash, acc| key = hash.keys.first acc[key] = hash.values.first unless acc.key?(key) end
最终结果
执行上述代码后,result即为你期望的单一哈希表:
{:W31=>0.1e1, :W32=>0.1e1, :W33=>0.1e1, :W34=>0.1e1, :W35=>0.5e1, :W36=>0.4e1, :W37=>0.1e1, :W38=>0.1e1}
内容的提问来源于stack exchange,提问作者Martin Somo
相关产品推荐
相关产品推荐

