首页 > 解决方案 > 如何通过组合具有不同值的键来合并具有相同 ID 的两个哈希

问题描述

我有一个哈希数组,如下所示:

hashes = [
  {id: 1, value: 'something', source: 'a'},
  {id: 1, value: 'something', source: 'b'},
  {id: 2, value: 'something', source: 'a'},
  {id: 3, value: 'something', source: 'c'}
]

我需要这个:

new_hashes = [
  {id: 1, value: 'something', source: ['a', 'b']},
  {id: 2, value: 'something', source: ['a']},
  {id: 3, value: 'something', source: ['c']}
]

我该怎么做呢?我尝试了以下方法:

merge_array = -> x,y { x.merge(y){|key, old, new| Array(old).push(new)} }
hashes.reduce &merge_array

但这将所有内容合并在一起。我不想合并具有不同 ID 的哈希。

标签: rubyhash

解决方案


hashes.
    group_by { |e| [e[:id], e[:value]] }.
    map { |_, g|
      g.first.clone.
          tap { |t|
            t[:source] = g.reduce([]) { |a, e| a << e[:source] }
          }
    }

首先按应该相同的部分对哈希进行分组。我们不再关心密钥;但是每个组本身都会映射到与组的第一个元素非常相似的东西。克隆它,这样原始hashes元素就不会发生变异;然后将其替换为所有组元素值:source的累积。:source


推荐阅读