9

私は次のようなハッシュを持っています

h = {1 => {"inner" => 45}、2 => {"inner" => 46}、 "inner" => 47}

キー「inner」を含むすべてのペアを削除するにはどうすればよいですか?
「内側」のペアの一部はに直接表示されh、他のペアはにペアで表示されることがわかります。h

「内側の」ペアのみを削除したいので、上記のハッシュで一括削除メソッドを呼び出すと、次のようになります。

h = {1 => {}、2 => {}}

これらのペアにはキーがないため=="inner"

4

5 に答える 5

9

本当に、これは拒否するものです !は:

def f! x
  x.reject!{|k,v| 'inner' == k} if x.is_a? Hash
  x.each{|k,v| f! x[k]}
end
于 2012-05-20T23:40:26.147 に答える
8
def f x 
  x.inject({}) do |m, (k, v)|
    v = f v if v.is_a? Hash  # note, arbitrarily recursive
    m[k] = v unless k == 'inner'
    m
  end
end

p f h

更新: 少し改善されました...

def f x
  x.is_a?(Hash) ? x.inject({}) do |m, (k, v)|
    m[k] = f v unless k == 'inner'
    m
  end : x
end
于 2012-05-20T20:16:11.867 に答える
7
def except_nested(x,key)
  case x
  when Hash then x = x.inject({}) {|m, (k, v)| m[k] = except_nested(v,key) unless k == key ; m }
  when Array then x.map! {|e| except_nested(e,key)}
  end
  x
end
于 2016-03-03T23:34:23.500 に答える
3

これが私が思いついたものです:

class Hash
  def deep_reject_key!(key)
    keys.each {|k| delete(k) if k == key || self[k] == self[key] }

    values.each {|v| v.deep_reject_key!(key) if v.is_a? Hash }
    self
  end
end

ハッシュまたは HashWithIndifferentAccess で機能します

> x = {'1' => 'cat', '2' => { '1' => 'dog', '2' => 'elephant' }}
=> {"1"=>"cat", "2"=>{"1"=>"dog", "2"=>"elephant"}}

> y = x.with_indifferent_access
=> {"1"=>"cat", "2"=>{"1"=>"dog", "2"=>"elephant"}}

> x.deep_reject_key!(:"1")
=> {"1"=>"cat", "2"=>{"1"=>"dog", "2"=>"elephant"}}

> x.deep_reject_key!("1")
=> {"2"=>{"2"=>"elephant"}}

> y.deep_reject_key!(:"1")
=> {"2"=>{"2"=>"elephant"}}
于 2013-02-15T17:21:16.500 に答える