对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一个选择数组)转换为表示这些选择组合的散列数组。例如:
# Input:
{ :color => [ "blue", "grey" ],
:size => [ "s", "m", "l" ] }
# Output:
[ { :color => "blue", :size => "s" },
{ :color => "blue", :size => "m" },
{ :color => "blue", :size => "m" },
{ :color => "grey", :size => "s" },
{ :color => "grey", :size => "m" },
{ :color => "grey", :size => "m" } ]
输入内部可能有其他选项,每个选项的选项数量不确定,但它只会嵌套 1 级深。任何
您基本上是在尝试计算组合,这意味着两个级别的迭代以及聚合这些运算结果的方式:
input = {:color=>["blue", "grey"], :size=>["s", "m", "l"]}
combinations = input[:color].flat_map do |color|
input[:size].collect do |size|
{ color: color, size: size }
end
end
puts combinations.inspect
# => [{:color=>"blue", :size=>"s"}, {:color=>"blue", :size=>"m"}, {:color=>"blue", :size=>"l"}, {:color=>"grey", :size=>"s"}, {:color=>"grey", :size=>"m"}, {:color=>"grey", :size=>"l"}]
这里< code>flat_map很方便,因为它折叠了内部展开的结果。
您可以尝试:
ary = input.map {|k,v| [k].product v}
output = ary.shift.product(*ary).map {|a| Hash[a]}
结果:
[
{:color=>"blue", :size=>"s"},
{:color=>"blue", :size=>"m"},
{:color=>"blue", :size=>"l"},
{:color=>"grey", :size=>"s"},
{:color=>"grey", :size=>"m"},
{:color=>"grey", :size=>"l"}
]
上述变体:
input = { color: [ "blue", "grey" ],
size: [ "s", "m", "l" ],
wt: [:light, :heavy] }
keys = input.keys
#=> [:color, :size, :wt]
values = input.values
#=> [["blue", "grey"], ["s", "m", "l"], [:light, :heavy]]
values.shift.product(*values).map { |v| Hash[keys.zip(v)] }
#=> [{:color=>"blue", :size=>"s", :wt=>:light},
# {:color=>"blue", :size=>"s", :wt=>:heavy},
# {:color=>"blue", :size=>"m", :wt=>:light},
# {:color=>"blue", :size=>"m", :wt=>:heavy},
# {:color=>"blue", :size=>"l", :wt=>:light},
# {:color=>"blue", :size=>"l", :wt=>:heavy},
# {:color=>"grey", :size=>"s", :wt=>:light},
# {:color=>"grey", :size=>"s", :wt=>:heavy},
# {:color=>"grey", :size=>"m", :wt=>:light},
# {:color=>"grey", :size=>"m", :wt=>:heavy},
# {:color=>"grey", :size=>"l", :wt=>:light},
# {:color=>"grey", :size=>"l", :wt=>:heavy}]
有人知道为什么IntelliJ Idea Ultimate不喜欢更新语法中的Ruby哈希文本吗?请参阅下面IDE屏幕截图中的红色下划线。语法: 真的很烦人,因为这意味着我的整个项目在目录树上都有一条红色下划线。 我在IDE首选项中设置了一个大于1.9的Ruby SDK版本(我认为是在这个时候引入了新的哈希文本语法),所以没有任何借口! 谢谢
在我的docker服务器上,我在sidekiq/redis URL-URL-Sespecification上出错: 我明白了 URI::InvalidURIError:方案redis不接受注册表部分:bsc\u redis:6379(或错误的主机名?)来自/usr/local/lib/ruby/2.0.0/uri/generic。rb:214:innew'from/usr/local/lib/ru
我正在使用Ruby和Selenium web驱动程序测试一个webapp。我无法检查显示网页中单元格的内容。我想要的是td中的IP。 我使用Firefox插件firepath获取IP的Xpath。它给出了“html/body/div[1]/div[2]/div[3]/form/table/tbody/tr[1]/td[6]/ul/li”,看起来是正确的。 但是我无法显示IP。这是我的测试代码; 把
问题内容: 我正在尝试对java中的AES数据进行编码,通过网络发送数据并以ruby对其进行解码。 基本字符串可以正常工作,但是一旦字符串的长度为16个字节或更多,我在解码后的红宝石字符串的编码中就会产生垃圾。我猜想它与填充有关(虽然不确定,因为它甚至影响精确大小为16的字符串) 我尝试使用PKCS或只是在字符串的末尾添加空格以匹配确切的长度而没有运气 还可以有人解释为什么我必须在红宝石中执行“
我正在使用来存储一些计算机模拟的结果。不幸的是,当文件变得太大(从我所看到的超过2GB)时,我无法再将文件写入磁盘,我收到以下错误; 我知道这可能是的限制,但我想知道是否有解决方法。例如,要读取大型 JSON 文件,我会先文件,然后分批读取。也许最终的解决方案应该是在后端切换到一个合适的数据库,但是由于特定Ruby(Sketchup)的一些限制,我使用这个并不总是可能的。
所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。