ruby:删除散列中的数组中的值

时间:2013-10-28 15:32:38

标签: ruby hash

我有这样的哈希:

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]}

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

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

    else
      params.except(key)
    end
  end

显然是不完整的。

感谢您的帮助,

3 个答案:

答案 0 :(得分: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]}

答案 1 :(得分: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

答案 2 :(得分: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]}