假如我有一个 hash 的结构是这样的:
@a = {
b: "xx",
c: "xxx",
...
}
限制传过一个 params[:a] 过来,怎么写最方便遍历一遍这个 hash 的值和@a比,里面的键值都存在,并且都不为空?
我限制写法是:
true if params[:a][:b].present? && params[:a][:c].present? &&..
这样写法 hash 多的话,就非常的长,不知道有没有更好的写法?
a = {
b: "xxx",
c: "lll",
d: "ooo",
f: "ui"
}
params[:a] ={
b: "x",
d: "ds"
g: "kds"
f: ""
}
我想要知道 params[:a] 和 a 比较,a 存在的键值,params[:a] 是否为空或者不存在,而 params[:a] 有,a 没有的键值则不需要管。
a = {
b: "xxx",
c: "lll",
d: "ooo",
f: "ui"
}
params = {}
params[:a] = {
b: "x",
c: "c",
d: "ds",
f: "f",
g: "g"
}
params[:b] = {
b: "x"
}
params[:c] = {
b: "x",
c: "c",
d: "ds",
f: "",
g: "g"
}
def not_empty(str)
str.to_s.strip.length != 0
end
a.all? { |key, _| params[:a].has_key?(key) && not_empty(params[:a][key]) } # => true
a.all? { |key, _| params[:b].has_key?(key) && not_empty(params[:b][key]) } # => false
a.all? { |key, _| params[:c].has_key?(key) && not_empty(params[:c][key]) } # => false
从@rei的方法改的,有 ActiveSupport 的话,用 present?就行。
...你的描述方式好奇怪。。。是只比较键……不管值吗。。。这样行不
(a.keys <=> params[:a].keys) >= 0
不过前提是你得确保键的形式是一致的。。。