Arrays 将数组元素映射到哈希值

Arrays 将数组元素映射到哈希值,arrays,ruby,hash,Arrays,Ruby,Hash,我这里有个杂烩 @property_hash = { :code => '', :fname => '', :lname => '', :basic_sal => '', :emp_type => '', } 和一个数组 line = [02,'Firstname', 'LastName', 5800, 'PL'] 我想把数组映射到散列中 @property_hash = { :code =>

我这里有个杂烩

    @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',
    }
最好的方法是什么?? 谢谢

您可以这样尝试:

 @property_hash.each_with_index {|(k, v), index| @property_hash[k] = line[index]}
这不是最好的方法,但会起作用

您可以这样尝试:

 @property_hash.each_with_index {|(k, v), index| @property_hash[k] = line[index]}

这不是最好的方法,但它会起作用

我的解决方案假设每一行的顺序都相同。因此,我用字段名定义了另一个数组,将相应的数组元素合并在一起,并将结果转换为哈希

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"}

我的解决方案假设行每次都具有相同的顺序。因此,我用字段名定义了另一个数组,将相应的数组元素合并在一起,并将结果转换为哈希

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"}

内存方面,将
@property\u hash
更改到位比将
@property\u hash
设置为新构造的hash更有效。这里有一种方法:

lc = line.dup
@property_hash.update(@property_hash) { lc.shift }
  #=> { :code => 02,
        :fname => 'Firstname',
        :lname => 'LastName',
        :basic_sal => 5800,
        :emp_type => 'PL' }

这使用了(aka
merge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值,这里是所有键。

内存方面,将
@property\u hash
更改到位比将
@property\u hash
设置为新构造的哈希更有效。这里有一种方法:

lc = line.dup
@property_hash.update(@property_hash) { lc.shift }
  #=> { :code => 02,
        :fname => 'Firstname',
        :lname => 'LastName',
        :basic_sal => 5800,
        :emp_type => 'PL' }

这使用了(aka
merge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值,这里是所有键。

这里是另一种方法:

[@property_hash.keys, line].transpose.to_h

还有一种方法可以做到:

[@property_hash.keys, line].transpose.to_h


我们可以假设<代码>行<代码>的顺序与<代码> @ PrimTythHAS</代码>相同吗?将来,考虑在选择答案之前等待更长时间。快速选择可能会阻碍其他答案,而且在我看来,对那些仍在准备答案的人(不是我)是不礼貌的。此外,所选答案有时会显示不正确(此处不适用)。许多人在等待GRIE之前至少等待几个小时。我们可以假设<代码>行<代码>的顺序与<代码> @ PrimTythHAS</代码>相同吗?将来,考虑在选择答案之前等待更长时间。快速选择可能会阻碍其他答案,而且在我看来,对那些仍在准备答案的人(不是我)是不礼貌的。此外,所选答案有时会显示不正确(此处不适用)。这里的许多人在授予greenie之前至少要等待几个小时。从Ruby 1.9及更高版本开始,散列条目是按创建顺序排序的,因此您现在可以依靠顺序的存在和一致性了。@SteveTurczyn:谢谢您提供的有用信息。我将编辑我的答案。
字段
可以写成
@property\u散列。键
@WandMaker:是的,你说得对。有了SteveTurczyn的信息,我可以这样做。从Ruby 1.9及以后的版本开始,散列条目是按创建顺序排序的,因此您现在可以依赖顺序的存在和一致性了。@SteveTurczyn:谢谢您提供的有用信息。我将编辑我的答案。
字段
可以写成
@property\u散列。键
@WandMaker:是的,你说得对。有了SteveTurczyn的信息,我可以这样做。Upvote,因为这会更改哈希,这比将
@property\u hash
设置为新构造的哈希更有效。请删除你的最后一句话(类似于“我肯定你会说‘不’,但你愿意和我一起去跳舞吗?”)。升级投票,因为这会更改哈希,这比将
@property\u hash
设置为新构造的哈希更有效。请删除你的最后一句话(类似于“我相信你会说‘不’,但你愿意和我一起去跳舞吗?”)。这是一个很好的把戏,不确定它是否会在现实生活中使用this@Wand,这是我第一次看到它时的印象,但我已经相当喜欢它了。首先,它返回更新后的散列,不像,例如,
h.keys.each{k|h[k]=lc.shift}
。很好的技巧,不确定它是否会在现实生活中使用this@Wand,这是我第一次看到它时的印象,但我已经相当喜欢它了。首先,它返回更新后的散列,与例如
h.keys.each{k|h[k]=lc.shift}
不同。更一般地说,当数组
a
b
大小相同时,
a.zip(b)
[a,b]。转置可以互换。更一般地说,当数组
a
b
大小相同时,
a.zip(b)
[a,b]。转置可以互换。