2015-02-12 91 views
1

这里是我的数组:如何从阵列创建哈希

sorted_array = [["Friday", "42", 8], ["Friday", "34", 8], ["Friday", "41", 78], ["Friday", "35", 7], ["Friday", "40", 7], ["Friday", "36", 6], ["Friday", "39", 7], ["Friday", "37", 56], ["Friday", "38", 6], ["Monday", "38", 3], ["Monday", "39", 5], ["Monday", "37", 54], ["Monday", "40", 6], ["Monday", "36", 6], ["Monday", "41", 7], ["Monday", "35", 7], ["Monday", "42", 7], ["Monday", "34", 8]] 

我需要做:

{ 'Friday' => [ ["42", 8], ["34", 8], ["41", 78], ["35", 7], [ "40", 7], ["36", 6], [ "39", 7], ["37", 56], [ "38", 6] ] } 

同样与"Monday"。可有人阐明这光?

这是我如何从POST获取数据:

{"0"=>{"Monday"=>{"34"=>8}, "Friday"=>{"34"=>8}}, "1"=>{"Monday"=>{"35"=>7}, "Friday"=>{"35"=>7}}, "2"=>{"Monday"=>{"36"=>6}, "Friday"=>{"36"=>6}}, "3"=>{"Monday"=>{"37"=>54}, "Friday"=>{"37"=>56}}, "4"=>{"Monday"=>{"38"=>3}, "Friday"=>{"38"=>6}}, "5"=>{"Monday"=>{"39"=>5}, "Friday"=>{"39"=>7}}, "6"=>{"Monday"=>{"40"=>6}, "Friday"=>{"40"=>7}}, "7"=>{"Monday"=>{"41"=>7}, "Friday"=>{"41"=>78}}, "8"=>{"Monday"=>{"42"=>7}, "Friday"=>{"42"=>8}}} 

然后,我把它变成数组排序:

hash_array = [] 
specific_ranges.each do |key, value| 
    value.each do |day, scores| 
     scores.each do |a_score, amount| 
     hash_array.push [day, a_score, amount] 
     end 
    end 
end 

排序:

sorted_array = hash_array.sort_by &:first 

回答

5

擦ŸMAGIC:

p sorted_array.group_by(&:shift) #=> {"Friday"=>[["42", 8], ["34", 8], ["41", 78], ["35", 7] ... 

说明:shift获取数组的第一个值,并在同一时间从阵列中删除,所以GROUP_BY功能产生你在寻找什么。

+2

这很漂亮。 – sawa 2015-02-12 11:56:16

+0

是的。这很可爱,你切肉饼。谢了哥们。 – 2015-02-12 23:03:17

0

我有一个快速的为你解决。这可能不是最佳的,但它是:

sorted_array = [["Friday", "42", 8], ["Friday", "34", 8], ["Friday", "41", 78], ["Friday", "35", 7], ["Friday", "40", 7], ["Friday", "36", 6], ["Friday", "39", 7], ["Friday", "37", 56], ["Friday", "38", 6], ["Monday", "38", 3], ["Monday", "39", 5], ["Monday", "37", 54], ["Monday", "40", 6], ["Monday", "36", 6], ["Monday", "41", 7], ["Monday", "35", 7], ["Monday", "42", 7], ["Monday", "34", 8]] 

s = sorted_array.select{|x| x[0] == 'Friday'}.each{|a| a.shift} 

Hash['Friday', s] 

这将根据您的需要返回结果。但在做的,我发现的代码行的限制:

s = sorted_array.select{|x| x[0] == 'Friday'}.each{|a| a.shift} 

运行只是一个单一的时间,如果你连续运行它的第二次它会返回一个空数组。所以,如果你使用这个,请注意这一点。希望这可以帮助。

0

这是Array#reduce一个标准的任务。

sorted_array.reduce({}) { |memo, e| 
    (memo[e.first] ||= []) << e[1..-1] 
    memo 
} 

这里我们用每个数组元素的其余部分来实现散列,使用第一个元素作为键。

UPD其实,你并不需要重新组织散列,一切可能一步之内完成:

h = {"0"=>{"Monday"=>{"34"=>8}, "Friday"=>{"34"=>8}}, "1"=>{"Monday"=>{"35"=>7}, "Friday"=>{"35"=>7}}, "2"=>{"Monday"=>{"36"=>6}, "Friday"=>{"36"=>6}}, "3"=>{"Monday"=>{"37"=>54}, "Friday"=>{"37"=>56}}, "4"=>{"Monday"=>{"38"=>3}, "Friday"=>{"38"=>6}}, "5"=>{"Monday"=>{"39"=>5}, "Friday"=>{"39"=>7}}, "6"=>{"Monday"=>{"40"=>6}, "Friday"=>{"40"=>7}}, "7"=>{"Monday"=>{"41"=>7}, "Friday"=>{"41"=>78}}, "8"=>{"Monday"=>{"42"=>7}, "Friday"=>{"42"=>8}}} 
h.reduce({}) { |memo, k| 
    k.last.each { |k,v| (memo[k] ||= []) << v.to_a.flatten } 
    memo 
} 
2

,你可以尝试这样的事情直接向您的数据:

data = {"0"=>{"Monday"=>{"34"=>8}, "Friday"=>{"34"=>8}}, "1"=>{"Monday"=>{"35"=>7}, "Friday"=>{"35"=>7}}, "2"=>{"Monday"=>{"36"=>6}, "Friday"=>{"36"=>6}}, "3"=>{"Monday"=>{"37"=>54}, "Friday"=>{"37"=>56}}, "4"=>{"Monday"=>{"38"=>3}, "Friday"=>{"38"=>6}}, "5"=>{"Monday"=>{"39"=>5}, "Friday"=>{"39"=>7}}, "6"=>{"Monday"=>{"40"=>6}, "Friday"=>{"40"=>7}}, "7"=>{"Monday"=>{"41"=>7}, "Friday"=>{"41"=>78}}, "8"=>{"Monday"=>{"42"=>7}, "Friday"=>{"42"=>8}}} 

a ||= Hash.new { |h, k| h[k] = [] } 
data.each{ |d| 
    d[1].keys.each { |key| 
    a[key] << d[1][key] 
    } 
} 

a 
# => {"Monday"=>[{"34"=>8}, {"35"=>7}, {"36"=>6}, {"37"=>54}, {"38"=>3}, {"39"=>5}, {"40"=>6}, {"41"=>7}, {"42"=>7}], "Friday"=>[{"34"=>8}, {"35"=>7}, {"36"=>6}, {"37"=>56}, {"38"=>6}, {"39"=>7}, {"40"=>7}, {"41"=>78}, {"42"=>8}]} 

可以通过如果需要,使用Array#uniq用于散列的阵列进一步提高的结果。

+0

不错。谢了哥们。 – 2015-02-12 23:07:40

1
sorted_array.group_by(&:first).map { |k, v| [k, v.map { |a| a[1..-1] }] }.to_h 
# {"Friday"=>[["42", 8], ["34", 8], ["41", 78], ["35", 7], ["40", 7], ["36", 6], ["39", 7], ["37", 56], ["38", 6]], 
# "Monday"=>[["38", 3], ["39", 5], ["37", 54], ["40", 6], ["36", 6], ["41", 7], ["35", 7], ["42", 7], ["34", 8]]} 
1
h = sorted_array.group_by(&:first).each_value{|a| a.each(&:shift)} 

h.select{|k, _| k == "Friday"} 
#=> { 'Friday' => [ ["42", 8], ["34", 8], ["41", 78], ["35", 7], [ "40", 7], ["36", 6], [ "39", 7], ["37", 56], [ "38", 6] ] } 
0

二为一价:

#1

arr.each_with_object({}) { |a,h| h.update(a.shift=>[a]) { |_,o,n| o+n } } 

#2

h = arr.group_by(&:first) 
h.each { |k,v| h[k] = v.transpose[1..-1].transpose }