ruby - 哈希到数组转换

标签 ruby arrays hash

我需要这个哈希

{"peter" => ["apple", "orange", "mango"], "sandra" => ["flowers", "bike"]}

转换成这个数组:

[["peter", "apple"], ["peter", "orange"], ["peter", "mango"], ["sandra", "flowers"], ["sandra", "bike"]]

现在我得到了这个解决方案

my_hash.inject([]){|ar, (k,v)| ar << v.map{|c| [k,c]}}.flatten(1)

但我相信这里有更优雅的解决方案,使用那些 ziptranspose magick :)

最佳答案

您对 Enumerable#inject 解决方案的怀疑是正确的。在 Ruby 中,inject/reduce 在某种程度上被滥用了,我们必须小心并选择正确的抽象(map、select、zip、flatten...),如果它们适合手头的问题。在这种情况下:

h = {"peter" => ["apple", "orange", "mango"], "sandra" => ["flowers", "bike"]}
h.map { |k, vs| vs.map { |v| [k, v] } }.flatten(1)
#=> [["peter", "apple"], ["peter", "orange"], ["peter", "mango"], ["sandra", "flowers"], ["sandra", "bike"]]

但是如果你想使用 Enumerable#zip 不要让任何人阻止你 ;-)

h.map { |k, vs| [k].cycle(vs.size).zip(vs) }.flatten(1)

正如@steenslag 所说,还有:

h.map { |k, vs| [k].product(vs) }.flatten(1)

所以最后我们可以这样写:

h.flat_map { |k, vs| [k].product(vs) }

关于ruby - 哈希到数组转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7513108/

相关文章:

java - 检查二维数组中的各个数组是否具有相等长度的有效方法

javascript - 寻找一种将对象数组从一个嵌入式脚本传递到另一个嵌入式脚本的方法

c++优化整数数组

ruby - 类型错误 : no implicit conversion of Hash into String

javascript - 在 JavaScript 中将用户输入编码为 URL GET 参数

ruby - 访问 self.method_added 中的变量名

ruby - 在定义中使用 `#`

ruby - 并发::Promise.all?不起作用

ruby - Rubocop 只检查修改后的行

php - 如何使用 PHP 生成正确的订单号?