[英]Ruby Array of hashes to a Hash
我有一個看起來像這樣的數組
array = [{ a: 123, b: 'foo', c: 'bar' }, { a: 456, b: 'baz', c: 'qux' }]
我想將其轉換為哈希,其鍵是array
中的哈希中:a
的值,並且其值包括帶有:b
和:c
的哈希。
{ 123 => { b: 'foo', c: 'bar' }, 456 => { b: 'baz', c: 'qux' } }
使用紅寶石可以做到嗎?
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"}}
我不確定您要解決什么問題。 這是我得出的結果:
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"}}
假設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"}}
使用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"}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.