我有一个数组arr
的地图,例如
arr == [ { pos => [0,0], color => :red, ... },
{ pos => [0,1], color => :green, ...},
{ pos => [1,0], color => :fuchsia, ...},
{ pos => [1,1], color => :red, ...},
...
]
其中
arr.map { |item| item.pos }
形成整数范围[0..n] x [0..m]
的笛卡尔积我很乐意通过他们的第一个坐标访问元素!所以使用像
这样的东西`newArr` == [
[{ second_coord => 0, color => :red...}, { second_coord => 1, color => :green,...}, .. ],
[{ second_coord => 0, color => :fuchsia,...}, { second_coord => 1, color => :red, ...},..],
...
]
因为如果我可以像它一样访问它,我相信我可以非常优雅和可读地编写代码。如果转换很短且可读,或者至少很短。任何提示?
答案 0 :(得分:1)
这应该可以解决问题:
new_array = arr.inject([]) |res, e| do
res[e.pos[0]] ||= [] # this row maybe not required
res[e.pos[0]] << {second_coord => e.pos[1], color => e.color }
end
您可能希望根据second_coord
对内部数组进行排序,但这很简单。