【问题标题】:Parse 2d arrays in an optimal way以最佳方式解析二维数组
【发布时间】:2020-01-05 05:44:46
【问题描述】:

我需要解析以下二维数组的散列,其中第一个数组具有键,其余数组具有值。

input = {
  "result": [
    [
      "id",
      "name",
      "address"
    ],
    [
      "1",
      "Vishnu",
      "abc"
    ],
    [
      "2",
      "Arun",
      "def"
    ],
    [
      "3",
      "Arjun",
      "ghi"
    ]
  ]
}

这是我想出的结果。

input[:result].drop(1).collect{|arr| Hash[input[:result].first.zip arr]}

在这里,我遍历 result 数组,忽略它的第一个子数组(包含键的那个),然后 zip 键数组和值数组进行散列,然后我将散列收集到另一个数组。

上述解决方案给了我我想要的哈希

[{"id"=>"1", "name"=>"Vishnu", "address"=>"abc"}, {"id"=>"2", "name"=>"Arun", "address"=>"def"}, {"id"=>"3", "name"=>"Arjun", "address"=>"ghi"}]

有没有更好的方法来达到同样的效果?

【问题讨论】:

    标签: arrays ruby multidimensional-array hash


    【解决方案1】:

    zip 是正确的工具,所以你的代码没问题。

    我会使用 Ruby 的 array decomposition 功能来提取键和值,并使用 to_h 而不是 Hash[]

    keys, *values = input[:result]
    values.map { |v| keys.zip(v).to_h }
    

    或者,如果您更喜欢“单线”:(更难理解 IMO)

    input[:result].yield_self { |k, *vs| vs.map { |v| k.zip(v).to_h } }
    

    【讨论】:

    • Array#yield_self 方式非常好。另外,如果你不介意,你能解释一下你的第一种方法更好吗?
    • 如果您使用的是 Ruby 2.6.0 或更高版本,您可以使用 #then 而不是 #yield_self,后者更短且更易于 imo 理解。
    • @vishnuprasanth 两个 sn-ps 是等效的,我只是觉得第一个更容易掌握。
    • 如果不清楚,@3limin4t0r 的意思是 Object#then 在 v2.6 中作为 Object#yield_self 的别名引入。
    猜你喜欢
    • 2011-08-21
    • 2013-11-08
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多