合并Ruby中的嵌套哈希

时间:2012-12-05 18:48:41

标签: ruby hash merge

  

可能重复:
  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:

我已经尝试过压缩,合并,以我知道的方式扩展哈希,但我能得到的最好的是一个新的哈希,它会丢弃除了找到的第一个第二级值以外的所有值。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

初始哈希:

  [
    [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