如何将包含哈希的这两个数组合并到第三个数组中?

时间:2014-09-16 12:18:37

标签: ruby arrays hash

我有两个包含产品信息哈希的数组。数组没有以有意义的方式排序。

数组A (产品数/哈希值= 27.605)包含:

  • itemId
  • description
  • 类别

例如

[
  {"itemId" => "wi225858",
   "description" => "Awesome product",
   "category" => "/Top products/"},
  {...}
]

数组B (产品数/哈希值= 18.498)包含:

  • itemId
  • description
  • 品牌

例如

[
  {"itemId" => "wi225858",
   "description" => "Awesome product",
   "brand" => "Coolio"},
  {...}
]

目标(产品/哈希值= 27.605):

  • 的itemId
  • 描述
  • 类别
  • 品牌

例如

[
  {"itemId" => "wi225858",
   "description" => "Awesome product",
   "category" => "/Top products/",
   "brand" => "Coolio"},
  {...},
  {"itemId" => "wi225605",
   "description" => "Brandless nice product",
   "category" => "/Nice products/"},
  {...}
]

itemId是唯一的。我希望Ruby代码从A中获取itemId,检查B是否包含具有相同itemId的产品,如果是,则将brand值添加到项目中。如果未找到brand,请将其留空。

代码应该创建一个带有产品哈希值的新数组,我可以保存到JSON文件中。

我试过了:

c = []

a.each do |one|
  b.each do |two|
    if one['itemId'] == two['itemId']
      combined_product = one.merge(two)

      c << combined_product
    end
  end
end

我对此代码有两个问题:

  1. c.size返回21.022,这意味着有6.583个没有brand的产品尚未将其转换为数组c
  2. 它很慢
  3. 我接下来可以尝试什么?

2 个答案:

答案 0 :(得分:2)

这个SO answer显示了一种简单的方法:

(a+b).group_by { |product| product["itemId"] }.map { |k,v| v.inject(:merge) }

以下是它的工作原理:

  1. 我们制作了一个包含所有产品的大阵列
  2. 我们将具有相同itemId
  3. 的产品组合在一起
  4. 最后我们循环并映射以合并相同的产品哈希

答案 1 :(得分:1)

存在设计缺陷。你应该有哈希而不是像

这样的数组
A = {
  "wi225858" => {
    "description" => "Awesome product",
    "category" => "/Top products/"
   },
  ...
}

B = {
  "wi225858" => {
    "description" => "Awesome product",
    "brand" => "Coolio"
  },
  ...
}

然后,你可以简单地做

A.merge(B){|_, a, b| a.merge(b)}

即使考虑将阵列转换为我建议的哈希所需的时间,它也应该比你现在所做的更快地运行。