2011-12-06 34 views

Trả lời

7

Thực sự rất lạ. Dù sao

[ { :user_id => 1, :search_id => "a"}, 
    { :user_id => 1, :search_id => "b"}, 
    { :user_id => 2, :search_id => "c"}, 
    { :user_id => 2, :search_id => "d"} ] \ 
    .map{ |h| h.values_at(:user_id, :search_id) } \ 
    .group_by(&:first) \ 
    .map{ |k, v| { :user_id => k, :search_id => v.map(&:last) } } 
+0

Ooh, đẹp hơn nhiều! +1 – Matchu

0

Trước hết, tôi nghĩ rằng cơ cấu sản lượng sạch ở đây là để cho phép các ID người dùng để có các phím băm và danh sách các ID tìm kiếm để có các giá trị:

{ 
    1 => [a, b], 
    2 => [c, d] 
} 

Có thể có một cách khéo léo sử dụng Giúp người giúp đỡ để có được cấu trúc này, nhưng cũng không quá tệ khi thực hiện theo cách thủ công, hoặc:

output = {} 
input.each do |row| 
    key = row[:user_id] 
    value = row[:search_id] 

    output[key] ||= [] 
    output[key] << value 
end 
0

Tôi đồng ý với đại diện của dữ liệu và chỉ muốn đề xuất một phiên bản ngắn hơn cho nó (đầu vào là mảng ban đầu).

input.each.with_object(Hash.new {|h,k| h[k] = []}) do |k,o| 
    o[k[:user_id]] << k[:search_id] 
end 

EDIT: đây là Ruby> 1,9

1
array.group_by{|x| x[:user_id] }.values.map do |val| 
    { user_id: val.first[:user_id], 
    search_id: val.inject([]){|me, el| me << el[:search_id]} } 
end 
0
input.inject({}) do 
    |m, h| (m[h[:user_id]] ||= []) << h[:search_id]; m 
end.inject([]) { |m, (k, v)| m << { :user_id => k, :search_id => v }; m } 
Các vấn đề liên quan