1

帮我写一个最简洁的方法,它接受一个参数(单级哈希)并返回一个值设置为 nil 的副本。

示例输入哈希

{
  email: 'hans@moleman.com',
  first_name: 'Hans',
  last_name: 'Moleman'
}

返回值

{
  email: nil,
  first_name: nil,
  last_name: nil
}
4

4 回答 4

4

那这个呢?

new_hash = Hash[original_hash.keys.zip([])]

获取散列的键,用一个空数组压缩以获取具有 nil 的键对,并使用Hash[]将其转换回散列。

或者,正如@mu_is_too_short 在评论中指出的那样,另一种可能不那么难以阅读的方法是:

new_hash = Hash[original_hash.keys.map { |k| [k, nil] }]

这是一个很好的选择,感谢@mu。

于 2013-05-04T19:54:58.343 回答
2
h= {
  email: 'hans@moleman.com',
  first_name: 'Hans',
  last_name: 'Moleman'
}
Hash[*h.flat_map{|k,_| [k,nil]}]
#=> {:email=>nil, :first_name=>nil, :last_name=>nil}

或者干脆

Hash[h.map { |k,_| [k,nil] }]
#=> {:email=>nil, :first_name=>nil, :last_name=>nil}
于 2013-05-04T19:54:56.700 回答
1

在其评论补充之前的问题的答案

h = {
  email: 'hans@moleman.com',
  first_name: 'Hans',
  last_name: 'Moleman'
}
h.keys.each{|k| h[k] = nil}

但不要忘记,还有一种更直接的方法可以清除哈希:

h.clear
h # => {}

问题的答案附有评论

original = {
  email: 'hans@moleman.com',
  first_name: 'Hans',
  last_name: 'Moleman'
}
h = {}
original.keys.each{|k| h[k] = nil}
h # The hash you want
于 2013-05-04T19:57:50.700 回答
0

我能想出的最佳解决方案:

def clear_values(single_level_hash)
  single_level_hash
    .keys
    .reduce({}) do |hash, key|
      hash[key] = nil
      hash
    end
end

肯定有更好的办法!

于 2013-05-04T19:51:12.500 回答