【问题标题】:Convert Array of Hashes to a Hash将哈希数组转换为哈希
【发布时间】:2019-10-27 13:30:00
【问题描述】:

我正在尝试转换以下内容:

dep = [
      {id: 1, depen: 2},
      {id: 1, depen: 3},
      {id: 3, depen: 4},
      {id: 5, depen: 3},
      {id: 3, depen: 6}
]

到单个哈希中:

# {1=>2, 1=>3, 3=>4, 5=3, 3=>6}

我尝试了在另一个 question 上找到的解决方案:

dep.each_with_object({}) { |g,h| h[g[:id]] = g[:dep_id] } 

但是,输出删除了元素并给了我:

#{1=>3, 3=>6, 5=>2}

最后一个元素也不正确。

【问题讨论】:

  • dep.map(&:values).to_h #=> {1=>3, 3=>6, 5=>3}。你当然不能有重复的键。 1=>31 的值从2 更新为33=>63 的值从 4 更新为 6

标签: ruby hash nested


【解决方案1】:

不能拥有像 {1=>2, 1=>3, 3=>4, 5=3, 3=>6} 这样的哈希值。哈希 mst 的所有键都必须是唯一的。

如果你想得到一个哈希映射每个 id 到一个 list 的依赖关系,你可以使用:

result = dep.
  group_by { |obj| obj[:id] }.
  transform_values { |objs| objs.map { |obj| obj[:depen] } }

或者

result = dep.reduce({}) do |memo, val|
  memo[val[:id]] ||= []
  memo[val[:id]].push val[:depen]
  memo
end

生产的

{1=>[2, 3], 3=>[4, 6], 5=>[3]}

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 2012-10-29
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多