将两个数组合并为Hash

时间:2014-12-10 00:49:39

标签: ruby-on-rails ruby arrays hash

我想要的结果是这样的:

{date: 12/02/2014, minutes: 36}

我正在使用Nokogiri:

dates = doc.css('td:nth-child(3)')
minutes = doc.css('td:nth-child(10)')

然后我做了一些过滤并将结果推送到数组中:

dates.each do |x|
 if x.text.length == 10
     date_array << x.text
 end
end

minutes.each do |x|
 minutes_array << x.text
end

如何将这两个阵列压缩在一起以创建我想要的结果?

我已尝试过这样的事情,但事情并不完全正确(给我{&#34; 2013-10-29&#34; =&gt;&#34; 32:14&#34 ;})

result = Hash[date_array.zip(minutes_array)]

甚至是这样的:

 result = Hash[date_array.zip(minutes_array).map {|d, m| {:date => d, :minutes => m}}

但我收到此错误:错误的元素类型哈希值为163

我也用.flatten修补但无济于事。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

假设你有两个相等长度的数组x和y

x = [:key1, :key2, :key3]
y =  [:value1, :value2, :value3]
z = {}
x.each_with_index { |key,index| z[key] = y[index] }

puts z

=> {:key1=>:value1, :key2=>:value2, :key3=>:value3}

是你在寻找什么?

那么也许这就是:

x = [:key1, :key2, :key3]
y =  [:value1, :value2, :value3]
z = []
x.each_with_index { |key,index| z << { date: key, minutes: y[index]} }



puts   z

{:date=>:key1, :minutes=>:value1}
{:date=>:key2, :minutes=>:value2}
{:date=>:key3, :minutes=>:value3}

答案 1 :(得分:2)

从nPn偷窃(我无法评论他的答案,因为我没有声誉)

假设你有

x = [ "date1", "date2", "date3"]
y = [ "time1", "time2", "time3"]

然后你可以这样做:

z = []
x.each_with_index { |k, i|  z << { date: k, time: y[i] }   }
puts z
=> [ { date: "date1", time: "time1" },  
     { date: "date2", time: "time2" },
     { date: "date3", time: "time3" } ]

这是你在找什么?

答案 2 :(得分:1)

您正尝试为多个值设置相同的密钥(日期,分钟)。相反,您可以使用所有这些日期 - 分钟组合的哈希数组,使用此 -

date.zip(minutes).reduce([]) { |memo, combo| memo << Hash[*[:date, :minutes].zip(combo).flatten] }

以下是它的外观 -

2.1.5 :035 > date=["10/10,2010","11/10/2010","12/10/2010","13/10/2010","14/10/2010"]
 => ["10/10,2010", "11/10/2010", "12/10/2010", "13/10/2010", "14/10/2010"] 
2.1.5 :036 > minutes = [10,20,30,40,50]
 => [10, 20, 30, 40, 50] 
2.1.5 :037 > date.zip(minutes).reduce([]) { |memo, combo| memo << Hash[*[:date, :minutes].zip(combo).flatten] }
 => [{:date=>"10/10,2010", :minutes=>10}, {:date=>"11/10/2010", :minutes=>20}, {:date=>"12/10/2010", :minutes=>30}, {:date=>"13/10/2010", :minutes=>40}, {:date=>"14/10/2010", :minutes=>50}] 
2.1.5 :038 > 

提醒注意事项 - 您应该使用Struct,然后创建一个Struct实例的数组,而不是像这样处理哈希数组。

答案 3 :(得分:1)

如果

dates   = ["12/02/14", "6/03/14"]
minutes = [12, 19]
然后,如果我没有误解这个问题,那就是:

dates.zip(minutes).map { |d,m| {date: d, minutes: m} }
  #=> [{:date=>"12/02/14", :minutes=>12}, {:date=>"6/03/14", :minutes=>19}]