将数组元素映射到散列值Ruby

时间:2016-04-19 13:38:17

标签: arrays ruby hash

我这里有哈希,

    @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',
    }

这样做的最佳方法是什么?   谢谢

4 个答案:

答案 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