Ruby on rails 在Ruby或Rails中,hash.merge({:order=>;';asc';})可以返回一个带有新键的新哈希。什么可以返回带有已删除密钥的新哈希?
在Ruby(或Rails)中,我们可以Ruby on rails 在Ruby或Rails中,hash.merge({:order=>;';asc';})可以返回一个带有新键的新哈希。什么可以返回带有已删除密钥的新哈希?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在Ruby(或Rails)中,我们可以 new_params = params.merge({:order => 'asc'}) 现在,new_params是一个添加了键的散列:order 但是是否有一行可以返回带有已删除密钥的哈希?线路 new_params = params.delete(:order) 无法工作,因为delete方法返回值,仅此而已。我们必须分三步做吗 tmp_params = params tmp_params.delete(:order) return tmp
new_params = params.merge({:order => 'asc'})
现在,new_params
是一个添加了键的散列:order
但是是否有一行可以返回带有已删除密钥的哈希?线路
new_params = params.delete(:order)
无法工作,因为delete
方法返回值,仅此而已。我们必须分三步做吗
tmp_params = params
tmp_params.delete(:order)
return tmp_params
有更好的办法吗?因为我想做一个
new_params = (params[:order].blank? || params[:order] == 'desc') ?
params.merge({:order => 'asc') :
(foo = params; foo.delete(:order); foo) # return foo
但上面的最后一行有点笨拙。有更好的方法吗
(注意:因为默认顺序是'desc',所以当没有
order
param时,这意味着它是默认的并且是desc
,然后将其切换到addorder=asc
,否则,只需删除paramorder
,使其返回到desc
的默认顺序)ActiveSupport
添加了一个Hash#除了
方法之外:
h1 = { a: 1, b: 2, c: 3 }
h1.except(:a) #=> {:b=>2, :c=>3}
一个更复杂的例子:
h1 = { a:1, b: 2, c: 3 }
h2 = { b: 3, d: 5 }
h1.merge(h2).except(*h1.keys-h2.keys) #=> {:b=>3, :d=>5}
这将用h2
中的密钥更新h1
中的密钥,从h2
中添加新密钥,并删除h1
中但不在h2
中的密钥。使用拒绝:
{:hello=> 'aaa'}.reject {| key, value | key == :hello} #=> {}
如果您不想依赖ActiveSupport,可以使用: params.delete_if {|key, value| key == :order } params.delete_如果{| key,value | key==:order}
是否要更改(析构函数)
参数
?如果您这样做,您应该直接按照tmp\u参数执行。删除(:order)
。如果没有,则需要在delete
之前dup
。总之,except
和reject
方法不会更改原始散列,而delete\u如果
实际更改了原始散列