从添加新密钥的数组创建哈希

时间:2016-09-13 13:29:04

标签: arrays ruby hash

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

app.get('/content2', function (req, res) { 
    res.render('partials/content2');
});

现在我想从下面创建一个哈希:

data =[[01, 777], [02, 888]]

我试着这样做:

n_clip = [{"name"=>"01", "rep"=>"777"},{"name"=>"02", rep=>"888"}]

但它没有用,因为我得到了:

n_clip = []
data.each do |a|
n_clip << Array[Hash[a.map {|| ["name", a.first]}], Hash[a.map {|| ["rep", a.last]}]]
end

并且最终它不是我所期望的。

3 个答案:

答案 0 :(得分:1)

data.map { |arr| { 'name' => arr[0], 'rep' => arr[1] } }

我宁愿使用符号作为哈希键

data.map { |arr| { name: arr[0], rep: arr[1] } }

答案 1 :(得分:1)

如果你想创建一个由两个哈希组成的数组,每个哈希都有相同的两个键,其他答案都可以。以下处理具有任意数量的键并且data可包含任意数量的元素的情况。

def hashify(keys, arr_of_vals)
  [keys].product(arr_of_vals).map { |ak,av| Hash[ak.zip(av)] }
end

keys = %w| name rep |
  #=> ["name", "rep"] 
arr_of_vals = [["01", "777"], ["02", "888"]]
hashify(keys, arr_of_vals)
  #=> [{"name"=>"01", "rep"=>"777"}, {"name"=>"02", "rep"=>"888"}]

在您的问题中,arr_of_vals必须首先来自[[1, 777], [02, 888]],但这是一个我不会解决的次要问题(相当普通)。

另一个例子:

keys = %w| name rep group |
  #=> ["name", "rep", "group"] 
arr_of_vals = [[1, 777, 51], [2, 888, 52], [1, 2, 53], [3, 4, 54]]
hashify(keys, arr_of_vals)
  #=> [{"name"=>1, "rep"=>777, "group"=>51}, {"name"=>2, "rep"=>888, "group"=>52},
  #    {"name"=>1, "rep"=>2, "group"=>53}, {"name"=>3, "rep"=>4, "group"=>54}] 

答案 2 :(得分:0)

data.map { |name, rep| { 'name' => name.to_s, 'rep' => rep.to_s } }