首页 > 解决方案 > Ruby - 散列数组、去重键、保留键去重的数组中的值

问题描述

如何从 arr 到 arr_result ?

arr = [ {a => 1}, 
        {a => 2}, 
        {b => 3}, 
        {b => 4},
        {b => 10},
        {c => 12}, 
        {c => 16},
        {d => 7}  ]

arr_result = [ {a => [1,2] }, 
               {b => [3,4,10] },
               {c => [12,16] },
               {d => 7  } ]

对键进行重复数据删除,并将这些键的值保存在发生重复数据删除的数组中。保留不发生重复数据删除的键/值(如示例中的 { d => 7 } 所示)

标签: arraysrubyhashduplicates

解决方案


您的输入首先不是有效的 ruby​​ 对象。

arr = [ {a: 1}, 
        {a: 2}, 
        {b: 3}, 
        {b: 4},
        {b: 10},
        {c: 12}, 
        {c: 16},
        {d: 7}  ]

arr.
  map(&:flatten).
  group_by(&:shift).
  each { |_, v| v.flatten! }
#⇒ {:a=>[1, 2], :b=>[3, 4, 10], :c=>[12, 16], :d=>[7]}

要得到你想要的东西:

arr.
  map(&:flatten).
  group_by(&:shift).
  map { |k, v| v.flatten! && { k => v.size == 1 ? v.first : v } }

#⇒ [{:a=>[1, 2]}, {:b=>[3, 4, 10]}, {:c=>[12, 16]}, {:d=>7}]

推荐阅读