为什么即使条件为真,拒绝也不能处理我的哈希?

Why is reject not working on my Hash even though the condition is true?

我有以下哈希

{"goes_by"=>[nil, ""], "middle_name"=>[nil, ""], "suffix"=>[nil, ""], "jersey"=>["8", "8A"]}

我正在尝试编写一个语句来拒绝任何具有带 nil 和“​​”的嵌套数组的元素。所以我写了下面的命令来尝试执行这个但是它 returns nil 好像哈希没有任何变化...

Player.find(286).audits.first.audited_changes.reject! {|x| x[1][0].blank? && x[1][1].blank? }
         => nil 

但是当我打印出结果时,其中三个元素的条件为真。我在这里错过了什么?

Player.find(286).audits.first.audited_changes.each {|x| puts x[1][0].blank? && x[1][1].blank? }

    true
    true
    true
    false

     => {"goes_by"=>[nil, ""], "middle_name"=>[nil, ""], "suffix"=>[nil, ""], "jersey"=>["8", "8A"]} 

请记住,您使用的是 reject! 和散列

{ "goes_by"=>[nil, ""],
  "middle_name"=>[nil, ""], 
  "suffix"=>[nil, ""],
  "jersey"=>["8", "8A"]
}.reject! {|key, value| value.all?(&:blank?) }]

这将 return => {"jersey"=>["8", "8A"]}

首先,当您在哈希上调用 reject! 时,请记住您的块应该采用两个参数,而不是一个。在您的情况下,参数 x 始终是哈希的键,因此分别为:goes_by、middle_name、后缀、

所以块应该是这样的:

.reject! { |key, array| array.all? { |array_item| array_item.blank? } }