我正在尝试从我目前在我的代码中拥有的数组创建不同类型的结构。
我有一个对象数组(活动目录对象),所以假设我从db获得了一个:
a = [o1,o2,o3,o4,o5]
我的对象具有属性source_id
和name
,它们是相关的属性。
我想从我的数组中的数据创建这样的结构(我想要哈希):
objects = Hash.new { |hash, key| hash[key] = [] }
这将是如何将数据放入新结构的一个示例:
a.each do |ob|
objects[ob.source_id] << {
:new => '',
:name => {:unformated => ob.name, :formatted => ob.format(:name)}
}
end
我正在尝试复制相同的结构,但在我的情况下它并没有成功:
a.group_by(&:source_id).map do |k,v|
{
k=> {
{
:new => '',
:name => {:unformated => v.name, :formatted => ob.format(:name)}
}
}
}
end.reduce(:merge)
这是我得到的错误:
! #<NoMethodError: undefined method `name' for #<Array:0xae542b4>>
答案 0 :(得分:1)
使用group_by
a.group_by(&:source_id).map
中的值将是共享相同source_id
而非单个元素的元素数组。
以下代码可以按照您的意愿执行:
a.group_by(&:source_id).map do |k,v|
{
k => v.map do |e|
{
:new => '',
:name => {:unformated => e.name, :formatted => e.format(:name)}
}
end
}
end.reduce(:merge)
答案 1 :(得分:0)
单打一个班轮做同样的事情
new_hash = a.each_with_object({}) { |o, hash| hash[o.source_id] = {:new => '', :unformatted => o.name, :formatted => o.format(:name)} }
这确实需要ruby 1.9.3