ruby - 如何通过组合具有不同值的键来合并具有相同 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 的哈希。
解决方案
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
推荐阅读
- google-apps-script - 有没有办法让 Google Forms 中的复选框中的每个选项成为 Google Sheets 中的标题?
- python - 如何将 STL 导入 pygltflib
- r - r控制台中汉字的输出问题,r版本4
- flutter - 无法为 TimeofDay 设置值,它始终为空
- arduino - ESP32 服务中断例程需要多快?
- loops - 邮递员测试。循环遍历嵌套对象数组以查找空值
- javascript - 检查 URL 中的查询字符串以及查询字符串是否在 javascript (vue) 中具有值
- python-3.x - Python异步函数循环+返回参数
- google-drive-api - 获取第三方网络应用程序的谷歌驱动文件的链接
- python - 使用 Geopandas 计算重叠特征