使用自定义规则比较两个哈希
Compare two hashes with customize rules
我需要比较 HTTP URL 中的查询。这是一个典型的查询:
a1 = "name=blabla&id=123456"
查询可能有变量,例如:
a2 = "name=blabla&id={CustomID}"
blur_compare(a1, a2)
应该是 true
。以下是其他情况:
a3 = "height=170&sex=male"
a4 = "name=blabla"
a5 = "name=blabla&id=654321"
a6 = "id={CustomeID}&name={CustomeName}"
blur_compare(a3, a2) #=> false, params doesn't match.
blur_compare(a4, a2) #=> false, param's number doesn't match.
blur_compare(a5, a1) #=> false, the id doesn't match.
blur_compare(a6, a2) #=> true. order doesn't matter.
我正在考虑将字符串传输到散列,例如
{"name" => "blabla", "id" => "123456"}
然后做比较。但是我的代码又长又乱又难看。很多 if
-else
条件。请问有没有更好的办法
抱歉,这是密码。只是有点不好意思分享它,尤其是当它写得不好的时候。但我正在学习 :).
path_query.rb
class PathQuery
def self.is_var?(str)
regex = /^{.*}$/
str =~ regex ? true : false
end
def self.blur_match_query?(query1, query2)
# deal with the condition when query1 or query2 maybe nil
if query1 == nil && query2 == nil
return true
elsif query1 == nil || query2 == nil
return false
else
end
res = true
# return false directly if number of keys is not equal
if query1.keys.size == query2.keys.size
query1.each{|k,v|
# when the value of same key is diff, then need to found out if one of them is variable.
if v != query2[k]
if not (PathQuery.is_var?(v) || PathQuery.is_var?(query2[k]))
res = false
break
end
end
}
else
res = false
end
res
end
end
test_path_query.rb
class TestPathQuery < Minitest::Test
def test_blur_match_query?()
a1 = {"name" => "blabla", "id" => "123456"}
a2 = {"name" => "blabla", "id" => "{CustomID}"}
a3 = {"height" => "170", "sex" => "male"}
a4 = {"name" => "blabla"}
a5 = {"name" => "blabla", "id" => "654321"}
a6 = {"id" => "{CustomeID}", "name" => "{CustomeName}"}
assert_equal true, PathQuery.blur_match_query?(a1, a2)
assert_equal false, PathQuery.blur_match_query?(a1, a3)
assert_equal false, PathQuery.blur_match_query?(a4, a2)
assert_equal false, PathQuery.blur_match_query?(a5, a1)
assert_equal true, PathQuery.blur_match_query?(a6, a2)
assert_equal true, PathQuery.blur_match_query?(nil, nil)
assert_equal false, PathQuery.blur_match_query?(nil, a2)
end
end
试试这个
def self.blur_match_query?(query1, query2)
(query1.keys-query2.keys).empty?
end
我需要比较 HTTP URL 中的查询。这是一个典型的查询:
a1 = "name=blabla&id=123456"
查询可能有变量,例如:
a2 = "name=blabla&id={CustomID}"
blur_compare(a1, a2)
应该是 true
。以下是其他情况:
a3 = "height=170&sex=male"
a4 = "name=blabla"
a5 = "name=blabla&id=654321"
a6 = "id={CustomeID}&name={CustomeName}"
blur_compare(a3, a2) #=> false, params doesn't match.
blur_compare(a4, a2) #=> false, param's number doesn't match.
blur_compare(a5, a1) #=> false, the id doesn't match.
blur_compare(a6, a2) #=> true. order doesn't matter.
我正在考虑将字符串传输到散列,例如
{"name" => "blabla", "id" => "123456"}
然后做比较。但是我的代码又长又乱又难看。很多 if
-else
条件。请问有没有更好的办法
抱歉,这是密码。只是有点不好意思分享它,尤其是当它写得不好的时候。但我正在学习 :).
path_query.rb
class PathQuery
def self.is_var?(str)
regex = /^{.*}$/
str =~ regex ? true : false
end
def self.blur_match_query?(query1, query2)
# deal with the condition when query1 or query2 maybe nil
if query1 == nil && query2 == nil
return true
elsif query1 == nil || query2 == nil
return false
else
end
res = true
# return false directly if number of keys is not equal
if query1.keys.size == query2.keys.size
query1.each{|k,v|
# when the value of same key is diff, then need to found out if one of them is variable.
if v != query2[k]
if not (PathQuery.is_var?(v) || PathQuery.is_var?(query2[k]))
res = false
break
end
end
}
else
res = false
end
res
end
end
test_path_query.rb
class TestPathQuery < Minitest::Test
def test_blur_match_query?()
a1 = {"name" => "blabla", "id" => "123456"}
a2 = {"name" => "blabla", "id" => "{CustomID}"}
a3 = {"height" => "170", "sex" => "male"}
a4 = {"name" => "blabla"}
a5 = {"name" => "blabla", "id" => "654321"}
a6 = {"id" => "{CustomeID}", "name" => "{CustomeName}"}
assert_equal true, PathQuery.blur_match_query?(a1, a2)
assert_equal false, PathQuery.blur_match_query?(a1, a3)
assert_equal false, PathQuery.blur_match_query?(a4, a2)
assert_equal false, PathQuery.blur_match_query?(a5, a1)
assert_equal true, PathQuery.blur_match_query?(a6, a2)
assert_equal true, PathQuery.blur_match_query?(nil, nil)
assert_equal false, PathQuery.blur_match_query?(nil, a2)
end
end
试试这个
def self.blur_match_query?(query1, query2)
(query1.keys-query2.keys).empty?
end