如何Dict.get一个不区分大小写的键?

时间:2017-06-07 13:50:43

标签: dictionary elm

我想获取Total-Records HTTP响应的response.headers密钥。

问题是在某些浏览器中它是由服务器Total-Records返回的,但在其他浏览器中,它是小写的。

我想获得Total-Records标头的值,无论其情况如何。 你会怎么做?

5 个答案:

答案 0 :(得分:3)

我认为最便宜的方式 - 一般来说 - 只是做两个查看,看看你得到了什么。例如,

case (Dict.get "Total-Records" response.headers, Dict.get "total-Records" response.headers) of 
    (Just s, _) -> 
         s 
    (_, Just s) ->
         s 
    _ ->
         <handle error case>

或者,您可以将上述内容替换为if then else

答案 1 :(得分:3)

如果没有通用的不区分大小写的字典,您可以将手动查找结合在一起:

caseInsensitiveGet : String -> Dict String v -> Maybe v
caseInsensitiveGet key dict =
    let
        lowerKey = String.toLower key
    in
        Dict.toList dict
            |> List.filterMap (\(k, v) ->
                if String.toLower k == lowerKey then
                    Just v
                else
                    Nothing)
            |> List.head

请注意,字典越大,性能越差。在这种形式下,可以在不同情况下对同一文本进行多种变换,因此它并不完美,但如果您只是寻找标题,那就足够了。

答案 2 :(得分:3)

另一种方法是使用find function from elm-community/dict-extra提供自定义比较运算符:

import Dict.Extra

caseInsensitiveGet : String -> Dict String v -> Maybe v
caseInsensitiveGet key =
    let
        lowerKey = String.toLower key
    in
        Dict.Extra.find (\k _ -> String.toLower k == lowerKey)
            >> Maybe.map Tuple.second

答案 3 :(得分:0)

在这种情况下,我想我可能会去(使用elm-community/list-extra):

getFirstCaseInsensitive : String -> Dict String v -> Maybe v
getFirstCaseInsensitive key dict =
    let
        key_ =
            String.toLower key
    in
        dict
            |> Dict.toList
            |> List.Extra.find
                ((==) key_ << String.toLower << Tuple.first)
            |> Maybe.map Tuple.second

答案 4 :(得分:0)

谢谢大家的回答,我最终使用了Dict.Extra.mapKeys

import Dict.Extra


headers =
       Dict.Extra.mapKeys String.toLower response.headers