【问题标题】:Ruby get array of subvalues from hash [closed]Ruby从哈希中获取子值数组[关闭]
【发布时间】:2024-01-23 17:25:01
【问题描述】:

我有一个这样的哈希:

members = { "name1" => { "country" => "country1", "city" => "city1"}, "name2" => { "country" => "country2", "city" => "city2"} }

我怎样才能从这个哈希中得到一个国家的数组,比如:

countries = [ "country1", "country2" ]

【问题讨论】:

  • 国家 = members.collect { |_,v| v[“国家”] }
  • 不知道为什么这被搁置了,我有几个可行的答案,所以我不是唯一一个知道我想要什么的人。

标签: ruby hash hashtable


【解决方案1】:
require 'benchmark'

Benchmark.bm do |x|
  x.report { members.map { |_,v| v["country"] } }
  x.report { members.collect { |_,v| v["country"] } }
  x.report { members.values.map{|h| h["country"]} }
end

  user     system      total        real
0.000000   0.000000   0.000000   (  0.000014)
0.000000   0.000000   0.000000   (  0.000011)
0.000000   0.000000   0.000000   (  0.000020)

=> ["country1", "country2"]

所以,请使用members.collect { |_,v| v["country"] },因为它是最快的。

【讨论】:

  • 请不要只用一个方法调用发布基准,这没有意义,这些值太小了,最后一个对你来说是最慢的只是随机的(我跑了10000 次迭代,最后一次实际上是最快的)。另外 - mapcollect 是别名,只是同一方法的不同名称。
  • 重申一下,mapcollect 是同一个功能。
【解决方案2】:
 countries = members.to_a.map(&:last).map{|h| h["country"]}

我测试过,它应该可以工作。

【讨论】:

  • to_a.map(&:last) 在这种情况下等同于 .values :) countries = members.values.map{|h| h["country"]}
  • 谢谢。你是对的。
  • 即使忽略 #values 似乎转换为数组并收集然后丢弃第二个值似乎是多余的。
  • 我已经实现了 Daniël 的简单符号,是的,它完美地工作!