将 Enumerable 转换为 Hash 的 Ruby 库函数

发布于 2024-10-14 09:54:37 字数 524 浏览 2 评论 0 原文

考虑 Enumerable 的这个扩展:

module Enumerable

  def hash_on
    h = {}
    each do |e|
      h[yield(e)] = e
    end
    h
  end

end

它的使用方式如下:

people = [
  {:name=>'fred', :age=>32},
  {:name=>'barney', :age=>42},
]
people_hash = people.hash_on { |person| person[:name] }
p people_hash['fred']      # => {:age=>32, :name=>"fred"}
p people_hash['barney']    # => {:age=>42, :name=>"barney"}

是否有一个内置函数已经执行此操作,或者足够接近它以至于不需要此扩展?

Consider this extension to Enumerable:

module Enumerable

  def hash_on
    h = {}
    each do |e|
      h[yield(e)] = e
    end
    h
  end

end

It is used like so:

people = [
  {:name=>'fred', :age=>32},
  {:name=>'barney', :age=>42},
]
people_hash = people.hash_on { |person| person[:name] }
p people_hash['fred']      # => {:age=>32, :name=>"fred"}
p people_hash['barney']    # => {:age=>42, :name=>"barney"}

Is there a built-in function which already does this, or close enough to it that this extension is not needed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

轻拂→两袖风尘 2024-10-21 09:54:37

Enumerable.to_h 接受 [key, value] 或用于将元素转换为 Hash 的块,因此您可以执行以下操作:

people.to_h {|p| [p[:name], p]}

该块应返回一个 2 元素数组,该数组将成为返回哈希。如果您有多个值映射到同一个键,则保留最后一个值。

在 Ruby 3 之前的版本中,您需要先使用 map 进行转换,然后再调用 to_h

people.map {|p| [p[:name], p]}.to_h

Enumerable.to_h accepts either a sequence of [key, value]s or a block for converting elements into a Hash so you can do:

people.to_h {|p| [p[:name], p]}

The block should return a 2-element array which becomes a key-value pair in the returned Hash. If you have multiple values mapped to the same key, this keeps the last one.

In versions of Ruby earlier than 3, you'll need to convert with map first before calling to_h:

people.map {|p| [p[:name], p]}.to_h
滴情不沾 2024-10-21 09:54:37
[   {:name=>'fred', :age=>32},
    {:name=>'barney', :age=>42},
].group_by { |person| person[:name] }

=> {"fred"=>[{:name=>"fred", :age=>32}],
   "barney"=>[{:name=>"barney", :age=>42}]}

键采用数组形式,可以有多个 Freds 或 Barneys,但如果您确实需要,可以使用 .map 来重建。

[   {:name=>'fred', :age=>32},
    {:name=>'barney', :age=>42},
].group_by { |person| person[:name] }

=> {"fred"=>[{:name=>"fred", :age=>32}],
   "barney"=>[{:name=>"barney", :age=>42}]}

Keys are in form of arrays to have a possibility to have a several Freds or Barneys, but you can use .map to reconstruct if you really need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文