0

我有一个这样的哈希:

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

我需要编写一个给定一对keyand的方法,value从哈希中删除这种对的出现。

例如,如果我通过这对夫妇,(: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]}

我不知道该怎么做,这是我到目前为止得到的:

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

    else
      params.except(key)
    end
  end

这显然是不完整的。

谢谢你的帮助,

4

3 回答 3

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]}
于 2013-10-28T16:00:13.630 回答
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
于 2013-10-28T16:17:47.503 回答
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]}
于 2013-10-28T17:24:27.867 回答