按属性重新排序,重新索引对象数组

时间:2012-08-21 11:03:48

标签: ruby arrays standard-library

我有一个数组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, ...},..],
              ...
            ]

因为如果我可以像它一样访问它,我相信我可以非常优雅和可读地编写代码。如果转换很短且可读,或者至少很短。任何提示?

1 个答案:

答案 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对内部数组进行排序,但这很简单。