当前位置: 首页 > 知识库问答 >
问题:

组合两个哈希数组

程亦
2023-03-14

寻找一种优雅的方式以特殊的方式合并两个散列数组:

new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"}, {"name" => "d", "data2" => "extra"}]
result = [{"name" => "a", "data" => "extra1"}, {"name" => "b"}, {"name" => "c"}]

如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。

我的第一次尝试是这样的,但是它创建了一个额外的散列:

def combine(new_data, old_data)
  int = []
  new_data.each do |s|
    old_data.each do |e|
      (int << (s.merge e)) if e["name"] == s["name"]
    end
    int << s
  end
  int
end

# => [{"name"=>"a", "data"=>"extra1"}, {"name"=>"a"}, {"name"=>"b"}, {"name"=>"c"}]

共有3个答案

高经艺
2023-03-14

假设

我假设:

  • new_data old_data中,“名称”的值都是唯一的;
  • new_data 是一个包含一个键值对的哈希数组;和
  • old_data 是一个包含至少两个键值对的哈希数组。

密码

def extract_elements(new_data, old_data)
  (new_data+old_data).group_by { |h| h["name"] }.
                      values.
                      select {  |a| a.size > 1 || a.first.size == 1 }.
                      map(&:last)
end

实例

new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"},
            {"name" => "d", "data2" => "extra"}]
extract_elements(new_data, old_data)
  #=> [{"name"=>"a", "data"=>"extra1"}, {"name"=>"b"}, {"name"=>"c"}] 

解释

对于上面的例子:

a = (new_data+old_data)
  #=> [{"name"=>"a"}, {"name"=>"b"}, {"name"=>"c"},
  #    {"name"=>"a", "data"=>"extra1"}, {"name"=>"d", "data2"=>"extra"}] 
b = a.group_by { |h| h["name"] }
  #=> {"a"=>[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
  #    "b"=>[{"name"=>"b"}],
  #    "c"=>[{"name"=>"c"}],
  #    "d"=>[{"name"=>"d", "data2"=>"extra"}]} 
c = b.values
  #=> [[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
  #    [{"name"=>"b"}],
  #    [{"name"=>"c"}],
  #    [{"name"=>"d", "data2"=>"extra"}]] 
d = c.select {  |a| a.size > 1 || a.first.size == 1 }
  #=> [[{"name"=>"a"}, {"name"=>"a", "data"=>"extra1"}],
  #    [{"name"=>"b"}],
  #    [{"name"=>"c"}]] 
e = d.map(&:last)
  #=> [{"name"=>"a", "data"=>"extra1"},
  #    {"name"=>"b"},
  #    {"name"=>"c"}] 

但书

这需要Ruby v1.9,因为它需要为哈希<code>b</code>维护密钥插入顺序。对于早期版本,请替换:

map(&:last)

跟:

map { |h| h.max_by(&:size) }
寿亦
2023-03-14

这有点棘手,但是您可以通过从new_data转换为查找哈希来解决它,然后遍历old_data以合并内容:

new_data = [{"name" => "a"}, {"name" => "b"}, {"name" => "c"}]
old_data = [{"name" => "a", "data" => "extra1"}, {"name" => "d", "data2" => "extra"}]

# Transform into a lookup table using "name" as a key
lookup = Hash[new_data.collect { |v| [ v['name'], v ] }]

old_data.each do |data|
  # Match based on "name"
  found = lookup[data['name']]

  next unless (found)

  # If found, swap out the element with a merged version
  # so the original is preserved as-is, not mangled.
  lookup[data['name']] = found.merge(data)
end

lookup.values
# => [{"name"=>"a", "data"=>"extra1"}, {"name"=>"b"}, {"name"=>"c"}]
景翰音
2023-03-14

一行程序,但在大型场景中可能不太有效。

new_data.map{ |e| e.merge(old_data.detect{ |e2| e2['name'] == e['name'] } || {}) }
 类似资料:
  • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。

  • 我有两个哈希数组: 我想在< code>a2中找到其< code>ID和< code>name字段与< code>a1中条目的< code>ID和< code>name字段相匹配的散列(不考虑< code>email或任何其他进入< code>a2的项目),然后将< code>ORDER_NO的值合并到< code>a1散列中也就是说,以下列方式结束: 我也想忽略 a2 中存在的元素,但不忽略 a

  • 我有两个二维数组: 在第一个 2D 阵列中,我有 2 个子阵列(实际上有 16 个) - 每个产品一个。它们中的每一个都为同一产品列出了不同的名称(每个产品可以有 1 到 22 个备用名称)。 在第二个 2D 阵列中,我有 2 个子阵列(实际上也有 16 个) - 每个产品每个价目表一个。它们中的每一个都列出了来自前一个 2D 数组中相应子数组的同一产品(实际上为 10 个价格选项)的不同价格(实

  • 对于一个电子商务应用程序,我试图将选项的散列(每个选项都有一个选择数组)转换为表示这些选择组合的散列数组。例如: 输入内部可能有其他选项,每个选项的选项数量不确定,但它只会嵌套 1 级深。任何

  • 我想将两个哈希数组合并到一个新数组中: 现在这就是我正在寻找的结果: 我在Ruby文档中唯一能找到的合并选项是用另一个散列覆盖重复项。那么如何才能达到我需要的版本呢?

  • 嗨,我有两个哈希数组,如下所示 如何将它们合并到单个哈希数组中作为〔{“name”= 因为我需要根据哈希转换的管道分隔cucumber表来验证它们,例如|name|value|rihan|true||gihan|true| 对于cucumber表,我使用以下函数将其转换为哈希 对于实际的 JSON 响应,我正在使用递归函数将其提取到两个哈希数组 [A] 和 [B] 上方,但我不确定如何合并它们以与