我想修改我的哈希数组以提高搜索性能
我有:
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”键/值对,如果这样可以使事情变得更容易。
答案 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的回答是正确的。