1

重複の可能性:
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 レベルの値を除くすべてを破棄する新しいハッシュが得られます。

何か案は?

4

1 に答える 1

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
                }
            }
        }
    ]
}

ワーキングデモ

于 2012-12-05T19:07:18.477 に答える