首页 > 解决方案 > Ruby:使用适当的组合从两个二维数组编译散列

问题描述

我有两个二维数组:

product_names_array = [product_one_names = ["Product One A", "Product One B"],
                      product_two_names = ["Product Two C", "Product Two D"]]
product_prices_array = [product_one_price = [product_one_price_1, product_one_price_2, product_one_price_3, product_one_price_4],
                        product_two_price = [product_two_price_1, product_two_price_2, product_two_price_3, product_two_price_4]]

在第一个二维数组中,我有 2 个子数组(实际上有 16 个) - 每个产品一个。它们中的每一个都为同一产品列出了不同的名称(每个产品可以有 1 到 22 个替代名称)。

在第二个二维数组中,我有 2 个子数组(实际上也有 16 个)——每个产品的每个价格表一个。它们中的每一个都从前一个二维数组中的对应子数组中列出了同一产品(可能有多个名称)的不同价格(实际上是 10 个价格选项)。

我想从数组中进行这样的哈希:

my_hash = {"Product One A" => [product_one_price_1, product_one_price_2, product_one_price_3, product_one_price_4],
          "Product One B" => [product_one_price_1, product_one_price_2, product_one_price_3, product_one_price_4],
          "Product One C" => [product_two_price_1, product_two_price_2, product_two_price_3, product_two_price_4],
          "Product Two D" => [product_two_price_1, product_two_price_2, product_two_price_3, product_two_price_4]}

如您所见,第一个二维数组中的数组中的每个值都与第二个二维数组中的每个对应数组创建了所有可能的组合。

然后我想像这样使用创建的哈希:

puts my_hash["Product One B"[2]] # => product_one_price_3

(我怀疑这个表达的正确性,所以如果你也能在这里帮助我,我将不胜感激......)

我还想避免定义新方法,因为此代码将用于 Redmine 的插件 Computed Custom Field 中,并且它不接受 def。

我已经重新阅读了一堆关于 Ruby 中的数组和哈希的信息,好吧,到目前为止,我什至还没有接近解决我的问题。任何帮助都会有所帮助!

标签: ruby

解决方案


您可以从zip方法中受益,该方法将组合两个数组中的相应元素
[0] - [0][1] - [1]依此类推)

result = product_names_array.zip(product_prices_array)
  .flat_map { |names, prices| names.map { |name| [name, prices] }}
  .to_h

result

# output
# product_one_prices: 11, 12, 13, 14
# product_two_prices: 21, 22, 23, 24
{
  "Product One A"=>[11, 12, 13, 14], 
  "Product One B"=>[11, 12, 13, 14], 
  "Product Two C"=>[21, 22, 23, 24], 
  "Product Two D"=>[21, 22, 23, 24]
}

推荐阅读