合并哈希数组的输出

时间:2015-05-28 22:22:34

标签: arrays ruby hash

希望这不是一个骗局,但我无法找到具体的答案。我必须使用哈希数组:

 a1 = [{"aws_ebs_stripe"=>"/dev/xvdi"}, {"aws_ebs_stripe"=>"/dev/xvdj"}, {"aws_ebs_stripe"=>"/dev/xvdk"}, {"aws_ebs_stripe"=>"/dev/xvdl"}]

 a2 = [{"volume_id"=>"vol-001011"}, {"volume_id"=>"vol-010110"}, {"volume_id"=>"vol-101101"}, {"volume_id"=>"vol-011001"}]

我将这些与我之前找到的一些代码结合起来

 Hash[a1.zip(a2.map { |i| i.include?(',') ? (i.split /, /) : i })]

我的想法是将此输出为带有pretty_generate的JSON,但输出中的第一个哈希值并不完全正确:

      {
      "{\"aws_ebs_stripe\"=>\"/dev/xvdi\"}": {
        "volume_id": "vol-001011"
      } .... snip

理想情况下,JSON应该如下所示

   "aws_ebs_stripe: /dev/xvdi": {
      "volume_id": "vol-001011"
    }

我不确定清理它的最佳方法。

2 个答案:

答案 0 :(得分:0)

看起来由于某种原因,你的哈希aws_ebs_stripe被解释为一个字符串,但正如Cary S.所提到的,你在问题中提出的哈希输出不会由你发布的代码生成。当我运行您发布的代码并在输出上使用ap(awesome_print)时,我得到了这个:

{
    { "aws_ebs_stripe" => "/dev/xvdi" } => {
        "volume_id" => "vol-001011"
    },
    { "aws_ebs_stripe" => "/dev/xvdj" } => {
        "volume_id" => "vol-010110"
    },
    { "aws_ebs_stripe" => "/dev/xvdk" } => {
        "volume_id" => "vol-101101"
    },
    { "aws_ebs_stripe" => "/dev/xvdl" } => {
        "volume_id" => "vol-011001"
    }
}

但是JSON总是会根据你创建它的方式进行转义。看看在你创建的哈希上调用.keys时会发生什么:

     :051 > ap h.keys
[
    [0] {
        "aws_ebs_stripe" => "/dev/xvdi"
    },
    [1] {
        "aws_ebs_stripe" => "/dev/xvdj"
    },
    [2] {
        "aws_ebs_stripe" => "/dev/xvdk"
    },
    [3] {
        "aws_ebs_stripe" => "/dev/xvdl"
    }
]

和h.values:

    :052 > ap h.values
[
    [0] {
        "volume_id" => "vol-001011"
    },
    [1] {
        "volume_id" => "vol-010110"
    },
    [2] {
        "volume_id" => "vol-101101"
    },
    [3] {
        "volume_id" => "vol-011001"
    }
]

您似乎需要正确地获取数据结构,以便以更有用的方式转换为json。

答案 1 :(得分:0)

如果您知道a1数组将始终只包含单键哈希值,则这是一种方法。

require 'json'
Hash[a1.map{ |el| "#{el.keys.first}: #{el.values.first}" }.zip(a2)].to_json

# => "{\"aws_ebs_stripe: /dev/xvdi\":{\"volume_id\":\"vol-001011  \"}, ...

对于在a1内的哈希中处理多个键值对的更通用的方法,就像这样。

Hash[a1.map{ |el| el.map { |k,v| "#{k}: #{v}" } }.flatten.zip(a2)].to_json

正如其他地方所述,如果可能,您可能希望改进数据结构。