【问题标题】:Merging nested hashes in Ruby [duplicate]在Ruby中合并嵌套哈希[重复]
【发布时间】:2012-12-06 03:13:43
【问题描述】:

可能重复:
Merging deep hash in ruby

所以我有一个具有以下结构的哈希(分解到 YAML 以供查看),我想通过第一个键合并/合并/展平。

- 1001: 
    Twitter: 
      values: 
        "2012-11-29": 24.0
- 1001: 
    Linkedin: 
      values: 
        "2012-11-29": 25.0
- 1001: 
    Facebook: 
      values: 
        "2012-11-29": 6.0

- 2002: 
    Twitter: 
      values: 
        "2012-11-29": 26.0
- 2002: 
    Pinterest: 
      values: 
        "2012-11-29": 1.0

我想尽可能简单地将其归结为以下形式:

- 1001
   Twitter:
     values:
       #some values here
   Facebook:
     values:
       #some values
- 2002
   Pinterest:
     values:
   Facebook:
     values:

我已经尝试过以我知道的各种方式压缩、合并、散列哈希,但我能得到的最好的结果是一个新的哈希,它会丢弃它找到的第一个 2 级值以外的所有值。

有什么想法吗?

【问题讨论】:

  • 谢谢亚历克斯。仍然需要知道如何将一大堆哈希相互合并? (即不仅仅是 a.deep_merge(b),而是 [a,b,c,d].deep_merge)

标签: ruby hash merge


【解决方案1】:

这是一个快速的解决方法。

初始哈希:

  [
    [0] {
        1001 => {
            "Twitter" => {
                "values" => {
                    "2012-11-29" => 24.0
                }
            }
        }
    },
    [1] {
        1001 => {
            "Linkedin" => {
                "values" => {
                    "2012-11-29" => 25.0
                }
            }
        }
    },
    [2] {
        1001 => {
            "Facebook" => {
                "values" => {
                    "2012-11-29" => 6.0
                }
            }
        }
    },
    [3] {
        2002 => {
            "Twitter" => {
                "values" => {
                    "2012-11-29" => 26.0
                }
            }
        }
    },
    [4] {
        2002 => {
            "Pinterest" => {
                "values" => {
                    "2012-11-29" => 1.0
                }
            }
        }
    }
]

使用inject 合并:

hash = hash.inject({}) {|f,c| k,v = c.first; (f[k] ||= []) << v; f }

获得这个:

{
    1001 => [
        [0] {
            "Twitter" => {
                "values" => {
                    "2012-11-29" => 24.0
                }
            }
        },
        [1] {
            "Linkedin" => {
                "values" => {
                    "2012-11-29" => 25.0
                }
            }
        },
        [2] {
            "Facebook" => {
                "values" => {
                    "2012-11-29" => 6.0
                }
            }
        }
    ],
    2002 => [
        [0] {
            "Twitter" => {
                "values" => {
                    "2012-11-29" => 26.0
                }
            }
        },
        [1] {
            "Pinterest" => {
                "values" => {
                    "2012-11-29" => 1.0
                }
            }
        }
    ]
}

Working Demo

【讨论】:

  • 天哪,这正是我需要的!让我看看我是否理解这是正确的:“对于每个 k,v,首先取嵌套哈希。将第一个键设置为新哈希,并将任何值转储到新哈希中”。听起来对吗?
  • 是的,对于 orig 散列中的每个键,它都会创建一个包含具有相同键的任何散列的数组
猜你喜欢
  • 2019-02-21
  • 2019-08-08
  • 2021-11-16
  • 2019-11-21
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多