# 改善前
# foo_hashにはどんなclassが入ってくるかわからないという状況。
if foo_hash.is_a?(Hash) && foo_hash.dig('data', 'title') == "bar"
やりたい処理
end
- まずHashかどうかの判定を入れて、その後目的のkey: valueがあるかを判定。
- が、判定を二段階で行うのが冗長に感じた。
# 改善後
# itemの中に期待するkey: valueがあるかどうかをチェックします。
# itemが入れ子になっていない場合:has_hash?(foo_hash,'title','bar')
# itemが入れ子になっている場合: has_hash?(foo_hash,['data','title'],'bar')
# deep_symbolize_keysはrailsのメソッドなので注意。
def has_hash?(item, key, value)
key = key.map &:to_sym if key.is_a?(Array)
key = key.to_sym if key.is_a?(String)
if item.is_a?(Hash)
item = item.deep_symbolize_keys
item.dig(*key) == value
end
end
if has_hash?(foo_hash,['data','title'],'bar')
やりたい処理
end
- 結構便利に作ったつもり。
- たぶん便利、なはず。
- 突っ込みどころがあれば是非。。