要向Hash添加新对,我会:

{:a => 1, :b => 2}.merge!({:c => 3})   #=> {:a => 1, :b => 2, :c => 3}

是否有类似的方法从哈希删除密钥?

这有效:

{:a => 1, :b => 2}.reject! { |k| k == :a }   #=> {:b => 2}

但我希望有类似的东西:

{:a => 1, :b => 2}.delete!(:a)   #=> {:b => 2}

重要的是返回值将是剩余的哈希值,因此我可以执行以下操作:

foo(my_hash.reject! { |k| k == my_key })

在一条线上。


#1楼

Rails有一个除外/外! 返回删除了这些键的哈希的方法 。 如果您已经在使用Rails,那么创建自己的版本是没有意义的。

class Hash# Returns a hash that includes everything but the given keys.#   hash = { a: true, b: false, c: nil}#   hash.except(:c) # => { a: true, b: false}#   hash # => { a: true, b: false, c: nil}## This is useful for limiting a set of parameters to everything but a few known toggles:#   @person.update(params[:person].except(:admin))def except(*keys)dup.except!(*keys)end# Replaces the hash without the given keys.#   hash = { a: true, b: false, c: nil}#   hash.except!(:c) # => { a: true, b: false}#   hash # => { a: true, b: false }def except!(*keys)keys.each { |key| delete(key) }selfend
end

#2楼

在纯Ruby中:

{:a => 1, :b => 2}.tap{|x| x.delete(:a)}   # => {:b=>2}

#3楼

如果你想使用纯Ruby(没有Rails),不想创建扩展方法(也许你只需要在一两个地方需要它,并且不想用大量方法污染名称空间)并且不想编辑哈希就位(即,你喜欢像我这样的函数式编程),你可以“选择”:

>> x = {:a => 1, :b => 2, :c => 3}
=> {:a=>1, :b=>2, :c=>3}
>> x.select{|x| x != :a}
=> {:b=>2, :c=>3}
>> x.select{|x| ![:a, :b].include?(x)}
=> {:c=>3}
>> x
=> {:a=>1, :b=>2, :c=>3}

#4楼

这是一种单行方式,但它不是很易读。 建议使用两行代替。

use_remaining_hash_for_something(Proc.new { hash.delete(:key); hash }.call)

#5楼

这也可行: hash[hey] = nil


#6楼

请参阅Ruby on Rails:删除多个哈希键

hash.delete_if{ |k,| keys_to_delete.include? k }

#7楼

如果您使用的是Ruby 2 ,则可以使用改进来代替猴子修补或不必要地包含大型库:

module HashExtensionsrefine Hash dodef except!(*candidates)candidates.each { |candidate| delete(candidate) }selfenddef except(*candidates)dup.remove!(candidates)endend
end

您可以使用此功能,而不会影响程序的其他部分,或者必须包含大型外部库。

class FabulousCodeusing HashExtensionsdef incredible_stuffdelightful_hash.except(:not_fabulous_key)end
end

#8楼

有很多方法可以从哈希中删除密钥并在Ruby中获取剩余的哈希值。

  1. .slice =>它将返回选定的键,而不是从原始哈希中删除它们。 使用slice! 如果你想永久删除密钥,否则使用简单的slice

     2.2.2 :074 > hash = {"one"=>1, "two"=>2, "three"=>3} => {"one"=>1, "two"=>2, "three"=>3} 2.2.2 :075 > hash.slice("one","two") => {"one"=>1, "two"=>2} 2.2.2 :076 > hash => {"one"=>1, "two"=>2, "three"=>3} 
  2. .delete =>它将从原始哈希中删除所选键(它只能接受一个键而不能超过一个键)。

     2.2.2 :094 > hash = {"one"=>1, "two"=>2, "three"=>3} => {"one"=>1, "two"=>2, "three"=>3} 2.2.2 :095 > hash.delete("one") => 1 2.2.2 :096 > hash => {"two"=>2, "three"=>3} 
  3. .except =>它将返回剩余的键但不删除原始哈希中的任何内容。 使用except! 如果你想永久删除密钥,否则使用简单的except

     2.2.2 :097 > hash = {"one"=>1, "two"=>2, "three"=>3} => {"one"=>1, "two"=>2, "three"=>3} 2.2.2 :098 > hash.except("one","two") => {"three"=>3} 2.2.2 :099 > hash => {"one"=>1, "two"=>2, "three"=>3} 
  4. .delete_if =>如果您需要根据值删除密钥。 它显然会从原始哈希中删除匹配的键。

     2.2.2 :115 > hash = {"one"=>1, "two"=>2, "three"=>3, "one_again"=>1} => {"one"=>1, "two"=>2, "three"=>3, "one_again"=>1} 2.2.2 :116 > value = 1 => 1 2.2.2 :117 > hash.delete_if { |k,v| v == value } => {"two"=>2, "three"=>3} 2.2.2 :118 > hash => {"two"=>2, "three"=>3} 
  5. .compact =>它用于从散列中删除所有nil值。 使用compact! 如果你想永久删除nil值,那么使用简单compact

     2.2.2 :119 > hash = {"one"=>1, "two"=>2, "three"=>3, "nothing"=>nil, "no_value"=>nil} => {"one"=>1, "two"=>2, "three"=>3, "nothing"=>nil, "no_value"=>nil} 2.2.2 :120 > hash.compact => {"one"=>1, "two"=>2, "three"=>3} 

结果基于Ruby 2.2.2。


#9楼

如果删除返回散列的删除对,那就太好了。 我这样做:

hash = {a: 1, b: 2, c: 3}
{b: hash.delete(:b)} # => {:b=>2}
hash  # => {:a=>1, :c=>3}

#10楼

删除哈希键的多种方法。 你可以使用下面的任何方法

hash = {a: 1, b: 2, c: 3}
hash.except!(:a) # Will remove *a* and return HASH
hash # Output :- {b: 2, c: 3}hash = {a: 1, b: 2, c: 3}
hash.delete(:a) # will remove *a* and return 1 if *a* not present than return nil

有很多方法,你可以在这里查看Hash的Ruby文档。

谢谢


#11楼

为什么不使用:

hash.delete(key)

#12楼

#in lib/core_extensions.rb
class Hash#pass single or array of keys, which will be removed, returning the remaining hashdef remove!(*keys)keys.each{|key| self.delete(key) }selfend#non-destructive versiondef remove(*keys)self.dup.remove!(*keys)end
end#in config/initializers/app_environment.rb (or anywhere in config/initializers)
require 'core_extensions'

我已经设置了这个,以便.remove返回哈希的副本,删除键,同时删除! 修改哈希本身。 这符合ruby惯例。 例如,从控制台

>> hash = {:a => 1, :b => 2}
=> {:b=>2, :a=>1}
>> hash.remove(:a)
=> {:b=>2}
>> hash
=> {:b=>2, :a=>1}
>> hash.remove!(:a)
=> {:b=>2}
>> hash
=> {:b=>2}
>> hash.remove!(:a, :b)
=> {}

#13楼

你可以使用except! 来自facets gem:

>> require 'facets' # or require 'facets/hash/except'
=> true
>> {:a => 1, :b => 2}.except(:a)
=> {:b=>2}

原始哈希不会改变。

编辑:正如Russel所说,facets存在一些隐藏的问题,并且与ActiveSupport不完全API兼容。 另一方面,ActiveSupport并不像facet那样完整。 最后,我使用AS并在代码中包含边缘情况。


#14楼

Oneliner普通红宝石,它只适用于红宝石> 1.9.x:

1.9.3p0 :002 > h = {:a => 1, :b => 2}=> {:a=>1, :b=>2}
1.9.3p0 :003 > h.tap { |hs| hs.delete(:a) }=> {:b=>2}

Tap方法总是返回调用的对象...

否则,如果您需要active_support/core_ext/hash (在每个Rails应用程序中自动需要),您可以根据需要使用以下方法之一:

➜  ~  irb
1.9.3p125 :001 > require 'active_support/core_ext/hash' => true
1.9.3p125 :002 > h = {:a => 1, :b => 2, :c => 3}=> {:a=>1, :b=>2, :c=>3}
1.9.3p125 :003 > h.except(:a)=> {:b=>2, :c=>3}
1.9.3p125 :004 > h.slice(:a)=> {:a=>1}

除了使用黑名单方法,因此它删除列为args的所有键,而slice使用白名单方法,因此它删除未列为参数的所有键。 还存在那些方法的爆炸版本( except!slice! ),它们修改给定的散列,但它们的返回值不同,它们都返回一个散列。 它代表slice!的删除键slice! 以及为except!保留的钥匙except!

1.9.3p125 :011 > {:a => 1, :b => 2, :c => 3}.except!(:a)=> {:b=>2, :c=>3}
1.9.3p125 :012 > {:a => 1, :b => 2, :c => 3}.slice!(:a)=> {:b=>2, :c=>3}

如何从Hash中删除一个键并获取Ruby / Rails中的剩余哈希?相关推荐

  1. 在 PHP 中从数组中删除一个元素

    问: 有没有一种简单的方法可以使用 PHP 从数组中删除一个元素,从而使 foreach ($array) 不再包含该元素? 我认为将它设置为 null 会做到这一点,但显然它不起作用. 答1: hu ...

  2. pandas从dataframe中删除一个或多个数据列

    pandas从dataframe中删除一个或多个数据列 目录 pandas从dataframe中删除一个或多个数据列 #删除数据列的基本语法

  3. Java循环中删除一个列表元素

    本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String ...

  4. python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

    本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...

  5. MySQL中删除主键

    在MySQL中删除主键需要两步.  1.如果有auto_increment,先删除之:  2.删除主键约束 primary key. 例如:  1)假设我们有个表products.里面的pid为主键, ...

  6. php画布怎么清除,JavaScript_JavaScript html5 canvas画布中删除一个块区域的方法,本文实例讲述了html5 canvas画布 - phpStudy...

    JavaScript html5 canvas画布中删除一个块区域的方法 本文实例讲述了html5 canvas画布中删除一个块区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 附:图 ...

  7. 从命令行参数中得到一个字符串,统计该字符串中字母 a 的出现次数。

    从字节或字符串数组中得到一个字符串,统计该字符串中字母 a 的出现次数. public class Test2 {public static void main(String[] args) {// ...

  8. 【python】 定义一个Person类,它包含数据成员age, name和gender。从Person中派生一个类Employee,在新类中添加一个数据成员,存储个人的number.等等

    # 定义一个Person类,它包含数据成员age, name和gender. # a. 从Person中派生一个类Employee,在新类中添加一个数据成员,存储个人的number. # 再从Empl ...

  9. 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )

    文章目录 一.创建 XmlParser 解析器 二.获取 Xml 文件中的节点 三.获取 Xml 文件中的节点属性 四.完整代码示例 一.创建 XmlParser 解析器 创建 XmlParser 解 ...

最新文章

  1. 1.21 Lambda表达式
  2. [D3D] - 用PerfHUD来调试商业游戏
  3. Linux ALSA声卡驱动之七:ASoC架构中的Codec
  4. [导入]Visual Studio 2005 Team Edition软件架构系列课程(1): 概述
  5. JavaSE——链表集合
  6. python房地产成本管理软件_大型房地产成本管理软件
  7. 大奖赛现场统分(哈工大Mooc)
  8. 北京最最最牛的IT公司都在这了
  9. JS JavaScript 实现文字上下滚动效果
  10. educoder Git入门之分支管理
  11. 个人独资公司税收标准
  12. 高等数学入门教程 — 自然底数e
  13. Apple pencil 无法连接到ipad的解决办法汇总
  14. java安装的时候无效参数,java.sql.SQLException: 调用中无效的参数
  15. 案例复盘:从上海首例遗弃犬只案看 如何精准研判舆情争议点
  16. 基于SSH网上体育用品销售系统
  17. echarts柱状图的样式调整及应用
  18. 开发环境搭建---数据库环境搭建
  19. 发布支持VR的Web3D内容
  20. 90后的互联网社交病:面对面交流也要发微信

热门文章

  1. Android ObjectOutputStream Serializable引发的血案
  2. Java、Android注解代码生成(ButterKnife原理、ViewBinding)
  3. Java中的双重检查锁(double checked locking)
  4. git删除远程分支文件
  5. Android开源控件ViewPager Indicator的使用方法
  6. swift_033(Swift 必备和常用第三方库以及pod使用)
  7. (0004) iOS 开发之CocoaPods 升级过程
  8. C++ delete 和 delete []的区别
  9. python CST中国标准时间格式转换
  10. LINUX 系统 安装Jexus 5.6和mono3.4 部署.net 环境