You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多层嵌套数组中的哈希结构转换为单一哈希表?

解决Ruby多层嵌套数组转单一哈希的问题

针对你提供的多层嵌套数组结构,我们可以通过以下步骤将其转换为单一哈希表,且保留每个键第一次出现的对应值:

实现思路

  1. 扁平化嵌套数组:将深度嵌套的数组展开为一维数组,提取所有单个键的哈希表。
  2. 合并哈希表:遍历扁平化后的哈希列表,将键值对合并到结果哈希中,重复键仅保留第一次出现的值。

代码实现

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:45:44