31

我有一个对象数组:

[
  #<User id: 1, name: "Kostas">,
  #<User id: 2, name: "Moufa">,
  ...
]

我想将其转换为以id为键,以对象为值的哈希。现在我这样做,但我知道有更好的方法:

users = User.all.reduce({}) do |hash, user|
  hash[user.id] = user
  hash
end

预期输出:

{
  1 => #<User id: 1, name: "Kostas">,
  2 => #<User id: 2, name: "Moufa">,
  ...
}
4

2 回答 2

71
users_by_id = User.all.map { |user| [user.id, user] }.to_h

如果您使用的是 Rails,ActiveSupport 提供Enumerable#index_by

users_by_id = User.all.index_by(&:id)
于 2013-04-02T10:12:32.697 回答
7

通过使用each_with_object而不是reduce.

users = User.all.each_with_object({}) do |user, hash|
  hash[user.id] = user
end
于 2013-04-02T10:11:22.580 回答