我有这样的哈希:
a = { a: 1, b: 2, c: [9, 8, 7]}
我需要编写一个给出一对key
和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
显然是不完整的。
感谢您的帮助,
答案 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]}