我有一个看起来像这样的数组
array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }]
我想将此转换为哈希,其键值为:a
中哈希值array
的值,其值包含:b
和{{1}的哈希值}。
:c
这是否可以使用ruby?
答案 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
(哈希)的所有元素都有一个键:a
且array
无法变异,请使用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"}}