我这里有哈希,
@property_hash = {
:code => '',
:fname => '',
:lname => '',
:basic_sal => '',
:emp_type => '',
}
和一个数组
line = [02,'Firstname', 'LastName', 5800, 'PL']
我想将数组映射到哈希,如
@property_hash = {
:code => 02,
:fname => 'Firstname',
:lname => 'LastName',
:basic_sal => 5800,
:emp_type => 'PL',
}
这样做的最佳方法是什么? 谢谢
答案 0 :(得分:2)
@property_hash.each_with_index {|(k, v), index| @property_hash[k] = line[index]}
不是最好的方法,但那会起作用
答案 1 :(得分:2)
我的解决方案假设每次都有相同的顺序。所以我用字段名定义另一个数组,将相应的数组元素合并在一起并将结果转换为哈希。
line = [02, 'Firstname', 'LastName', 5800, 'PL']
fields = @property_hash.keys
# => [:code, :fname, :lname, :basic_sal, :emp_type]
key_value_pairs = fields.zip(line)
# => [[:code, 2], [:fname, "Firstname"], [:lname, "LastName"], [:basic_sal, 5800], [:emp_type, "PL"]]
@property_hash = Hash[key_value_pairs]
# => {:code=>2, :fname=>"Firstname", :lname=>"LastName", :basic_sal=>5800, :emp_type=>"PL"}
答案 2 :(得分:1)
在内存方面,更改@property_hash
的效率更高,而不是将@property_hash
设置为等于新构造的哈希。这是一种方法:
lc = line.dup
@property_hash.update(@property_hash) { lc.shift }
#=> { :code => 02,
:fname => 'Firstname',
:lname => 'LastName',
:basic_sal => 5800,
:emp_type => 'PL' }
这使用Hash#update(又名merge!
)的形式,它使用块来确定合并的两个哈希中存在的键的值,这里是所有键。
答案 3 :(得分:1)
这是另一种方法:
[@property_hash.keys, line].transpose.to_h