获取哈希键的嵌套数组的第一个元素

时间:2016-11-04 20:59:37

标签: ruby-on-rails arrays ruby hash

假设我有一个看起来像这样的数组:

> head(df)
    d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20
758  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
759  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
760  0  1  0  0  0  0  0  0  0   0   1   0   0   0   1   1   0   0   1   0
761  0  1  0  0  0  0  0  0  0   0   1   0   0   1   0   1   0   0   1   0
762  0  0  1  0  0  0  0  0  0   0   0   0   1   1   0   1   0   0   1   0
763  0  0  1  0  0  0  0  0  0   0   0   0   1   0   1   1   0   0   0   1

有没有办法让我得到一个看起来像的哈希:

[
  [["str1"],["val1"],["val2"]],
  [["str2"], ["val1"], ["val2"], ["val3"]]
] 

3 个答案:

答案 0 :(得分:3)

whileStatement: "while" '(' expression ')' statement

如果您不希望将每个元素放在单独的数组中:

a.map { |a| [a.first.first, a.drop(1)] }.to_h
# or
a.each_with_object({}) {|a, h| h[a.first.first] = a.drop(1) }
#=> {
#     "str1"=>[["val1"], ["val2"]],
#     "str2"=>[["val1"], ["val2"], ["val3"]]
#   }

答案 1 :(得分:2)

如果你的数组是arr,你可以写下以下内容。

Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a.map(&:first)] }.to_h
  #=> {"str1"=>["val1", "val2"],
  #     "str2"=>["val1", "val2", "val3"]}

略有变化:

Marshal.load(Marshal.dump(arr)).map { |a| [a.shift.first, a] }.to_h
  #=> {"str1"=>["val1", "val2"],
  #     "str2"=>["val1", "val2", "val3"]}

注意:我们正在使用Marshal类制作arr的精确副本,以避免修改原始数组。 Object#dupObject#clone在这里工作不起作用。

答案 2 :(得分:0)

arr = [
  [["str1"],["val1"],["val2"]],
  [["str2"], ["val1"], ["val2"], ["val3"]]
]

arr.each_with_object({}) { |((k), *values), h| h[k]=values }
  #=> {"str1"=>[["val1"], ["val2"]], "str2"=>[["val1"], ["val2"], ["val3"]]}

这说明了Ruby如何使用并行赋值来确定块变量的值是有利的。