Ruby哈希哈希数组

时间:2018-03-27 10:21:50

标签: arrays ruby hash

我有一个看起来像这样的数组

array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }]

我想将此转换为哈希,其键值为:a中哈希值array的值,其值包含:b和{{1}的哈希值}。

:c

这是否可以使用ruby?

4 个答案:

答案 0 :(得分:2)

array.each_with_object({}){|e, h| e = e.dup; h[e.delete(:a)] = e}
# => {123=>{:b=>"foo", :c=>"bar"}, 456=>{:b=>"baz", :c=>"qux"}}

如果您不关心副作用:

array.each_with_object({}){|e, h| h[e.delete(:a)] = e}
# => {123=>{:b=>"foo", :c=>"bar"}, 456=>{:b=>"baz", :c=>"qux"}}

答案 1 :(得分:1)

我不确定你要解决的问题是什么。这就是我提出来的:

def group_by_key(array, key)
  array.map { |x| [x.delete(key), x] }.to_h
end

它适用于您的示例:

array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }]
group_by_key(array, :a)
#=> {123=>{:b=>"foo", :c=>"bar"}, 456=>{:b=>"baz", :c=>"qux"}}

答案 2 :(得分:0)

假设array(哈希)的所有元素都有一个键:aarray无法变异,请使用Hash#reject

array.each_with_object({}) { |g,h| h[g[:a]] = g.reject { |k,_| k == :a } }
  #=> {123=>{:b=>"foo", :c=>"bar"}, 456=>{:b=>"baz", :c=>"qux"}}

答案 3 :(得分:0)

使用Hash#select方法。

array.map { |v| [v.fetch(:a), v.select { |k,_| k != :a }] }.to_h

完全:a, :b & :c

array.map { |v| [v.fetch(:a), v.select { |k,_| [:b, :c].include? k }] }.to_h

输出

{123=>{:b=>"foo", :c=>"bar"}, 456=>{:b=>"baz", :c=>"qux"}}