Arrays 合并哈希数组的输出

Arrays 合并哈希数组的输出,arrays,ruby,hash,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-01

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

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

我不确定最好的清理方法

看起来出于某种原因,您的hash aws_ebs_条带被解释为字符串,但正如Cary S.所述,您在问题中提供的hash输出不会由您发布的代码生成。当我运行您发布的代码并在输出上使用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.价值观:

    :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。

如果您知道
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

但是,正如其他地方提到的,如果可能的话,您可能希望改进数据结构。

为什么不只要求json,然后在哈希上调用_json?您希望正在构造的哈希值是
:aws
的值。对的在
a2.map{| i |…
中,
i
是散列,因此
i.include?(','))如果
i
有一个键
,“
”,则
是正确的。这是您想要的吗?它作为更大哈希的一部分发出。我认为您必须更清楚地了解生成的JSON的实际外观。为什么要在
a2
上调用
.map
?输出似乎与更简单的完全相同ode>Hash[a1.zip(a2)]
。我想这就是我不清楚的地方,合并这些数组的最佳方法。太棒了!通用方法满足了我的需要。谢谢!