[
{entry_id: 1,field_id: 1, content: "x"},
{entry_id: 1,field_id: 2, content: "xx"},
{entry_id: 2,field_id: 1, content: "xxx"},
{entry_id: 2,field_id: 2, content: "xxxx"}
]
上面是原始数据,下面是目标结果
[
{entry_id: 1, data: {1: "x", 2: “xx”}},
{entry_id: 2, data: {1: "xxx", 2: "xxxx"}}
]
问怎么实现,想了半天头一直混混的,没想到方法,求指导,多谢。
ps:ruby + activerecord, 没有 rails,如果有需要可以加 gem
new_datas = {}
datas.each do |data|
unless new_datas.key?(data[:entry_id])
new_datas[data[:entry_id]] = {:data => {}}
end
new_datas[data[:entry_id]][:data].merge!({"field_#{data[:field_id]}" => data[:content]})
end
思路差不多就是这样了,自己改改
datas.group_by { |hash| hash[:entry_id] }.map do |_, value|
new_hash = {entry_id: value.first[:entry_id], data: Hash.new}
value.each { |grouped_hash| new_hash[:data]["field_#{grouped_hash[:field_id]}"] = grouped_hash[:content] }
new_hash
end
lz 你是真的懒啊。
# 。。。
new_datas[data[:entry_id]] = {:entry_id => data[:entry_id], :data => {}}
# 。。。
new_datas.values
用 group_by,map,inject
data.group_by{|e| e[:entry_id]}.map{|k, v| {:entry_id => k, :data => v.inject({}){|h, e| h.merge("field_#{e[:field_id]}".to_sym => e[:content])}}}
#10 楼 @quakewang 非常感谢,个人也有点单行的癖好哈,多谢多谢。
才发现我需求写的有问题,结果里面没有自定义字符,是 id 值,所以改了如下,结果 ok 了。
data.group_by{|e| e[:entry_id]}.map{|k, v| {:entry_id => k, :data => v.inject({}){|h, e| h.merge(e[:field_id] => e[:content])}}}
其实我还是有点晕,等清醒了理理,平时对 inject 用的很不熟悉。多谢。
来个我的
h.group_by{|doc| doc[:entry_id]}.collect{|k,v| {entriy_id: k, data: v.collect{|v| v.reject{|k,v| k.eql? :entry_id}}}}