如何从红宝石哈希中删除特定的“零”值?

时间:2018-07-25 16:39:54

标签: ruby

考虑以下哈希值:

H = {"a" => 100, "b" => 200, "c" => nil, "d" => nil}

我想用nil保留"c"的值,并用nil除去"d"的值。我该怎么办?

应用compact将删除所有nil值(即,使用键"c""d")。

问题Removing all empty elements from a hash / YAML?解决了这个问题,但我认为应该有一个等效于.compact的功能。

4 个答案:

答案 0 :(得分:1)

有一个method

h.delete_if { |k,v| v.nil? }

k,v代表键/值对。

如果您可以量化为什么要保留c密钥的原因,可以将其合并到逻辑中。仅仅是保存的第一个nil吗?

如果是这样,您可以尝试以下方法:

count = 0
h.delete_if { |k,v| v.nil? && (count += 1) != 1 }

请注意,Ruby是区分大小写的语言,H由于是大写字母而成为常量。对于变量,只能使用小写字母。

此外,声明Ruby哈希的传统方法是:

h = { "a" => 100, "b" => 200, "c" => nil, "d" => nil }

仅在需要字符串键的情况下。使用符号键,它更加简洁:

h = { a: 100, b: 200, c: nil, d: nil }

答案 1 :(得分:0)

如果我明白这一点,一旦您知道特定的键必须为nil,例如"c",您可以执行以下操作:

h = {"a"=>100, "b"=>200, "c"=>nil, "d"=>nil}
h.compact!["c"] = nil

# => {"a"=>100, "b"=>200, "c"=>nil}

现在,如果您致电h["c"],您会得到nil

还请考虑当您简单地执行h.compact!并致电h["c"]时,您仍然会得到nil

答案 2 :(得分:0)

gui.getBoardPanel().getP2().getClass();

如果生成的键顺序不重要,则可以编写:

h = Hash["a" => 100, "b" => 200, "c" => nil, "d" => nil]

h.compact.merge("c" => nil)
  #=> {"a"=>100, "b"=>200, "c"=>nil}

如果要在适当位置修改哈希值。

答案 3 :(得分:0)

如果这只是一个键,为什么不Hash#delete从哈希实例中删除该对呢?

enabled Maps SDK