追加 - ruby 配列の中にハッシュ




別の配列のキーだけを取得するためにハッシュの配列をフィルタリングするにはどうすればよいですか? (3)

私は配列の各ハッシュのキーのサブセットを取得しようとしています。

ハッシュは実際ははるかに大きいですが、これはわかりやすいと思いました。

[
  {
    id:2,
    start: "3:30",
    break: 30,
    num_attendees: 14
  },
  {
    id: 3,
    start: "3: 40",
    break: 40,
    num_attendees: 4
  },
  {
    id: 4,
    start: "4: 40",
    break: 10,
    num_attendees: 40
  }
]

私はidstart値だけを取得したい。

私はもう試した:

return_keys = ['id','start']
return_array = events.select{|key,val|  key.to_s.in? return_keys}

これは空の配列を返します。


あなたがRailsを使用している(またはActiveSupportの全部または一部を引っ張ってもかまわない)場合、 Hash#slice使うことができHash#slice

return_array = events.map { |h| h.slice(:id, :start) }

Hash#sliceはカバーの下でいくつかの余分な仕事をしますが、それはおそらくあなたが小さなハッシュのためにそれに気づかないほどの速さであり、透明度はかなりいいです。


これはあなたが望むことをするはずです:

events.map do |hash|
  hash.select do |key, value|
    [:id, :start].include? key
  end
end

潜在的に速い(だがそれほどかわいらしくない)解決策:

events.map do |hash|
  { id: hash[:id], start: hash[:start] }
end

return_keysを動的にする必要がある場合:

return_keys = [:id, :start]
events.map do |hash|
  {}.tap do |new_hash|
    return_keys.each do |key|
      new_hash[key] = hash[key]
    end
  end
end

あなたのコードでは、 select配列から要素を取り出すことに注意してください。なぜなら、それを呼び出すためですが、配列に含まれるハッシュは変更しないからです。

パフォーマンスが懸念される場合は、ここに記載されているすべてのソリューション( code )をベンチマークしました。

                user     system      total        real
amarshall 1  0.140000   0.000000   0.140000 (  0.140316)
amarshall 2  0.060000   0.000000   0.060000 (  0.066409)
amarshall 3  0.100000   0.000000   0.100000 (  0.101469)
tadman 1     0.140000   0.010000   0.150000 (  0.145489)
tadman 2     0.110000   0.000000   0.110000 (  0.111838)
mu           0.130000   0.000000   0.130000 (  0.128688)

効率が懸念されるように見えるので、私は以下を提案する。

コード

require 'set'

def keep_keys(arr, keeper_keys)
  keepers = keeper_keys.to_set
  arr.map { |h| h.select { |k,_| keepers.include?(k) } }
end

これはHash#select使用しHash#select 。これは、 Enumerable#selectとは異なり、ハッシュを返します。 keeper_keysを高速検索のためのセットに変換しkeeper_keysた。

arr = [{ id:2, start: "3:30", break: 30 },
       { id: 3, break: 40, num_attendees: 4 },
       { break: 10, num_attendees: 40 }]

keep_keys arr, [:id, :start]
  #=> [{:id=>2, :start=>"3:30"}, {:id=>3}, {}] 
keep_keys arr, [:start, :break]
  #=> [{:start=>"3:30", :break=>30}, {:break=>40}, {:break=>10}] 
keep_keys arr, [:id, :start, :cat]
  #=> [{:id=>2, :start=>"3:30"}, {:id=>3}, {}] 
keep_keys arr, [:start]
  #=> [{:start=>"3:30"}, {}, {}] 
keep_keys arr, [:cat, :dog]




hash