1

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

我有:

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”键/值对,如果这使事情变得更容易的话。

4

3 回答 3

2

要获得您描述的数组:

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

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

b = a.inject({}) {|h,i| h[i["id"]]=i; h}
于 2012-11-28T00:50:49.827 回答
2

尝试:

a.map{|record| the_id = record.delete("id"); {the_id => record}}
于 2012-11-28T00:52:56.240 回答
1
a.each_with_object({}) { |x, h| h[x.delete('id')] = x }

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

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

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

根据 kmkaplan 的其他评论进行编辑:如果 OP 真的不困惑,Nate Murray 的答案是正确的。

于 2012-11-28T00:45:17.450 回答