我正在使用一组OpenStruct对象,如下所示:
a=[<OpenStruct name="test1", x="6", id="1">,<OpenStruct name="test2", x="5", id="2"><OpenStruct name="test1", x="8", id="3">...]
我想将具有相同名称的OpenStruct对象分组,如下所示:
a=[<OpenStruct name="test1",x=["6","8"], id=["1","3"]>,<OpenStruct name="test2", x="5", id="2">]
我该怎么做?
答案 0 :(得分:1)
您可以使用group_by和map方法。我认为代码是自我解释的。
a = [
OpenStruct.new(name: "test1", x: "6", id: "1"),
OpenStruct.new(name: "test2", x: "5", id: "2"),
OpenStruct.new(name: "test1", x: "8", id: "3")
]
a.group_by(&:name).map do |name, as|
OpenStruct.new(
name: name,
x: as.map(&:x),
id: as.map(&:id)
)
end
# => [#<OpenStruct name="test1", x=["6", "8"], id=["1", "3"]>, #<OpenStruct name="test2", x=["5"], id=["2"]>]
答案 1 :(得分:0)
这样的事情应该有效:
a = [
OpenStruct.new(name: "test1", x: "6", id: "1"),
OpenStruct.new(name: "test2", x: "5", id: "2"),
OpenStruct.new(name: "test1", x: "8", id: "3")
]
a.each_with_object({}) { |o, h|
h[o.name] ||= OpenStruct.new(name: o.name, x: [], id: [])
h[o.name][:x] << o.x
h[o.name][:id] << o.id
}.values
#=> [#<OpenStruct name="test1", x=["6", "8"], id=["1", "3"]>, #<OpenStruct name="test2", x=["5"], id=["2"]>]
请注意x
的{{1}}和id
属性也会转换为数组。这通常是首选。
重命名属性以指示数组可能是个好主意,即test2
而不是ids
。