2013-10-28 14 views
0

我有這樣的哈希:紅寶石:在一個數組,它是在一個散列刪除值

a = { a: 1, b: 2, c: [9, 8, 7]} 

我需要編寫給定的一對keyvalue的方法,消除了這種耦合的發生從散列。

例如,如果我通過夫妻(:a, 1)我獲得的散列:

a = { b: 2, c: [9, 8, 7]} 

如果我通過夫妻(:c, 8)我獲得的散列:

a = { a: 1, b: 2, c: [9, 7]} 

如果我通過夫妻(:a, 3)我獲得(不變)散列:

a = { a: 1, b: 2, c: [9, 8, 7]} 

我是n確信如何做到這一點,這是我到目前爲止:

def remove_criterion (key, value) 
    all_params = params.slice(key) 
    if all_params[key].class == Array 

    else 
     params.except(key) 
    end 
    end 

這顯然是不完整的。

感謝您的幫助,

+1

如果你有散列'{a:[[1],2]}',並給出了鍵':a'和值'[1]'',會發生什麼?因爲[[1],2]是'[1],2'],所以''[1]'應該從'[[1],2]'中刪除,因爲它是它的一個元素, '?你的問題不清楚。 – sawa

+0

'{a:[[1],2]}'在我的上下文中沒有意義,所以對於這種情況,任何行爲都可以。它不會合理地發生。 –

+0

那麼什麼可以出現在你的散列,什麼不能?你沒有提到任何限制。你應該在問題中說明。 – sawa

回答

2

這裏有一個解決方案:

def remove_criterion key, value 
    params.each_with_object({}) do |pair, h| 
    k, v = *pair 
    if k == key 
     case v 
     when Array 
     nv = v.reject { |each| each == value } 
     h[k] = nv unless nv.empty? 
     else 
     h[k] = v unless v == value 
     end 
    else 
     h[k] = v 
    end 
    end 
end 

測試它在IRB:

irb(main):007:0> remove_criterion :a, 1 
=> {:b=>2, :c=>[9, 8, 7]} 
irb(main):008:0> remove_criterion :c, 8 
=> {:a=>1, :b=>2, :c=>[9, 7]} 
irb(main):009:0> remove_criterion :a, 3 
=> {:a=>1, :b=>2, :c=>[9, 8, 7]} 
0
def remove_criterion(key, value) 
    params.each do |k,v| 
    if k == key and v == value 
     params.delete(key) 
    elsif v.class == Array and v.include?(value) 
     v.delete(value) 
    end 
    end 
    params 
end 
0

我會做這樣的:

def doit(h,k,v) 
    return h unless h.include?(k) 
    if h[k] == v 
    h.delete(k) 
    elsif h[k].is_a? Array  
    h[k].delete(v) 
    end 
    h 
end 

h = {a: 1, b: 2, c: [9, 8, 7]} 

doit(h,:b,2) # => {:a=>1,  :c=>[9, 8, 7]} 
doit(h,:b,3) # => {:a=>1, :b=>2, :c=>[9, 8, 7]} 
doit(h,:c,8) # => {:a=>1, :b=>2, :c=>[9, 7]} 
doit(h,:c,6) # => {:a=>1, :b=>2, :c=>[9, 8, 7]} 
doit(h,:d,1) # => {:a=>1, :b=>2, :c=>[9, 8, 7]}