将哈希数组转换为嵌套哈希数组

时间:2012-11-28 00:41:36

标签: ruby-on-rails hash

我想修改我的哈希数组以提高搜索性能

我有:

a = [ {"id" => 1, "name" => "Matt", "email" => "matt@example.com"}, {"id" => 2, "name" => "Charlie", "email" => "charlie@example.com"} ]

我想将其转换为:

b = [ {1 => { "name" => "Matt", "email" => "matt@example.com"}},{2 => { "name" => "Charlie", "email" => "charlie@example.com"}} ]

请注意,“id”字段不一定是顺序或连续集,但每次出现都是唯一的。此外,嵌套为b中的值的哈希值可以包含“id”键/值对,如果这样可以使事情变得更容易。

3 个答案:

答案 0 :(得分:2)

获取您描述的阵列:

b = a.map {|i| { i["id"] => i } }

但是请注意,如果你这样做是为了通过id执行有效的搜索,那么构建一个哈希而不是一个数组:

b = a.inject({}) {|h,i| h[i["id"]]=i; h}

答案 1 :(得分:2)

尝试:

a.map{|record| the_id = record.delete("id"); {the_id => record}}

答案 2 :(得分:1)

a.each_with_object({}) { |x, h| h[x.delete('id')] = x }

这将构造一个新的哈希({}),并将其作为h传递到块中,每个元素x。在块x.delete('id')中从id中删除x键/值,并返回它,以便它可以用作索引,为结果h哈希值赋值。

编辑每kmkaplan的评论:如果你仍然需要原始数组,请使用:

a.each_with_object({}) { |x, h| c = x.clone; h[c.delete('id')] = c }

编辑每kmkaplan的另一条评论:如果OP真的没有混淆,Nate Murray的回答是正确的。