我正在使用一个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">]我该怎么做呢?
发布于 2013-09-23 22:10:35
您可以使用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"]>]发布于 2013-09-23 21:26:13
像这样的东西应该是有效的:
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"]>]请注意,test2的x和id属性也会转换为数组。这通常是首选的。
重命名属性以指示数组可能是个好主意,例如,用id代替ids。
https://stackoverflow.com/questions/18959914
复制相似问题