0

現在コードにある配列とは異なる種類の構造を作成しようとしています。

オブジェクト (アクティブ ディレクトリ オブジェクト) の配列を取得したので、 from 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>>
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 に答える