复杂的地图由ruby中的对象属性

时间:2013-07-31 13:21:56

标签: ruby

我正在尝试从我目前在我的代码中拥有的数组创建不同类型的结构。

我有一个对象数组(活动目录对象),所以假设我从db获得了一个:

a = [o1,o2,o3,o4,o5]

我的对象具有属性source_idname,它们是相关的属性。

我想从我的数组中的数据创建这样的结构(我想要哈希):

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>>

2 个答案:

答案 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