繁体   English   中英

Ruby将数组映射到哈希

[英]Ruby mapping array into hash

我有一个2D数组,每行如:

['John', 'M', '34']

我想映射到一个哈希数组,每个哈希像:

{:Name=>"John", :Gender=>"M", :Age=>"34"}

这样做有一种优雅的方式吗?

array_of_rows.map { |n,g,a| { Name: n, Gender: g, Age: a } }

要么

array_of_rows.map { |row| %i{Name Gender Age}.zip(row).to_h }

它们会产生相同的结果,所以选择一个你觉得更清楚的结果。 例如,给定此输入:

array_of_rows = [
  ['John', 'M', '34'],
  ['Mark', 'M', '49']
]

表达式将产生此输出:

[{:Name=>"John", :Gender=>"M", :Age=>"34"}, 
 {:Name=>"Mark", :Gender=>"M", :Age=>"49"}]

您可以尝试使用zip然后to_h (代表哈希)

例如:

[:Name, :Gender, :Age].zip(['John', 'M', '34']).to_h
=> {:Name=>"John", :Gender=>"M", :Age=>"34"}

在这里阅读更多关于zip

并在这里阅读to_h

people = [['John', 'M', '34']]
keys = %i{Name Gender Age}

hashes = people.map { |person| keys.zip(person).to_h }
# => [{:Name=>"John", :Gender=>"M", :Age=>"34"}]

基本上我将两个数组组合成一个哈希(一个带键,一个带值)的方法是使用Array#zip 这可以将[1,2,3][4,5,6]变成[[1,4], [2,5], [3,6]]

通过to_h可以很容易地将此​​结构转换为散列

array_of_rows = [
  ['John', 'M', '34'],
  ['Mark', 'M', '49']
]

keys = ['Name', 'Gender', 'Age']

[keys].product(array_of_rows).map { |k,v| k.zip(v).to_h }
  #=> [{"Name"=>"John", "Gender"=>"M", "Age"=>"34"},
  #    {"Name"=>"Mark", "Gender"=>"M", "Age"=>"49"}]

要么

keys_cycle = keys.cycle
array_of_rows.map do |values|
  values.each_with_object({}) { |value, h| h[keys_cycle.next]=value }
do

这是另外一种方法

array_of_rows = [
  ['John', 'M', '34'],
  ['Mark', 'M', '49']
]

keys = [:Name, :Gender, :Age]

array_of_rows.collect { |a| Hash[ [keys, a].transpose] }
#=>[{:Name=>"John", :Gender=>"M", :Age=>"34"}, {:Name=>"Mark", :Gender=>"M", :Age=>"49"}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM