Is there an equivalent to `Array::sample` for hashes? Is there an equivalent to `Array::sample` for hashes? ruby ruby

Is there an equivalent to `Array::sample` for hashes?


Hash[original_hash.to_a.sample(n)]

For Ruby 2.1,

original_hash.to_a.sample(n).to_h


I don't know of such method. Still you can do something like:

h[h.keys.sample]

If you need to sample more than one element the code will have to be a bit more complicated.

EDIT: to get key value pairs instead of only the value you can do something like:

keys_sample = h.keys.sample(n)keys_sample.zip(keys_sample.map{|k| h[k])


Reading the top ranked answers, I'd go with it depends:

  1. If you want to sample only one element from the hash, @Ivaylo Strandjev's solution only relies on hash lookup and Array#sample:

    hsh[hsh.keys.sample]
  2. To sample multiple hash elements, @sawa's answer leverages Array#to_h:

    hsh.to_a.sample(n).to_h

Note that, as @cadlac mentions, hsh.to_a.sample.to_h won't work as expected. It will raise

TypeError: wrong element type String at 0 (expected array)

because Array#sample in this case returns just the element array, and not the array containing the element array.

A workaround is his solution, providing an n = 1 as an argument:

hsh.to_a.sample(1).to_h

PS: not looking for upvotes, only adding it as an explanation for people newer to Ruby.