2014-12-20 4 views
0

я знаю, что это простой вопрос, но его так frustating для меня, я перепробовал много часов и я не сделал, поэтому я надеюсь, что можно найти ответ,рельсов группирование массива хэш

У меня есть массив хэш как этот

array = [{date: 1, branch: 1, value: "100"}, {date: 1, branch: 2, value: "200"}, {date: 2, branch: 1, value: "500"}, {date: 3, branch: 2, value: "500"}, {date: 3, branch: 3, value: "300"}] 

и я хочу, чтобы сгруппировать его как этот

data = [{date: 1, 1: "100", 2: "200"}, {date: 2, 1: "500"}, {date: 3, 2: "500", 3: "300"}] 

в массиве = [{дата: 1, филиал: 1, значение: "100"}, я хочу взять значение ветви и ценности и объединить его как thi s 1: «100»

в любом случае я могу это сделать, нет никаких проблем, если есть с помощью петли или случай, когда метод

ответ

3

Вероятно, можно было бы сократить, но это работает:

array.group_by { |h| h[:date] }.map do |k, v| 
    [:date, k, *v.map { |h| [h[:branch], h[:value]] }] 
end.map { |x| Hash[*x.flatten] } 
# => [{:date=>1, 1=>"100", 2=>"200"}, {:date=>2, 1=>"500"}, {:date=>3, 2=>"500", 3=>"300"}] 
+0

ничего себе, его полностью работает, то есть полностью из моей памяти, любой сайт или ссылки можно прочитать о карте массива, я должен еще узнать о том, что – azy

+0

@azy документация объясняет все с примерами: ['Array # map'] (http://www.ruby-doc.org/core-2.1.5/Array.html#method-i-map) – August

1

другой решение

array = [{date: 1, branch: 1, value: "100"}, {date: 1, branch: 2, value: "200"}, {date: 2, branch: 1, value: "500"}, {date: 3, branch: 2, value: "500"}, {date: 3, branch: 3, value: "300"}] 
data = array.inject({}) do |res, val| 

    if res[val[:date]] 
    res[val[:date]].merge!({val[:branch] => val[:value]}) 
    else 
    res.merge!(val[:date] => {val[:branch] => val[:value]}) 
    end 
    res 
end 
puts data.collect{|key, val| {date: key}.merge!(val)} 
Смежные вопросы