0

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

我有一个对象数组(活动目录对象),所以可以说我从 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>>
4

2 回答 2

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)
于 2013-07-31T13:28:00.100 回答
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

于 2013-07-31T13:48:25.083 回答