簡體   English   中英

Ruby哈希表到哈希表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM