【问题标题】:Map dictionary to array to string将字典映射到数组到字符串
【发布时间】:2019-01-17 13:59:57
【问题描述】:

我正在处理一个字典,我需要将其解析为一个字符串,以便为 GraphQL 突变创建一个属性。 我的字典是[String: Bool],我需要提取设置为true的键。

let dict: [String: Bool] = ["Objct1": true, "Objct2": false, "Objct3": true]

目前我正在使用四个函数(filter、enumerate、map 和 join),虽然我得到了想要的结果,但我想知道我是否需要所有这些函数:

let string = dict.filter { $0.value }
    .enumerated()
    .map {
        return $0.offset == 0
            ? "\"\($0.element.key)\""
            : ", \"\($0.element.key)\""
    }
    .joined()

编辑: 最后的字符串需要包裹在":""Objct1", "Objct3""

【问题讨论】:

    标签: swift higher-order-functions


    【解决方案1】:

    您可以使用单个compactMap,因为首先您需要filter 您的Dictionary 只保留true 值,然后您需要map 返回key对应于true 值。但是,您始终可以将后续的 filtermap 调用合并到一个 compactMap 中,因为 compactMap 只保留 non-nil 值,因此不要像 filter 那样返回布尔值,以防万一如果条件计算为真,则返回 map 中返回的任何内容,否则返回 nil

    let trueKeys = dict.compactMap({key, value in value ? key : nil})
    

    要将键连接成单个字符串,您只需在 compactMap 的结果上调用 joined

    let graphQueryString = dict.compactMap({key, value in value ? "\"\(key)\"" : nil}).joined(separator: ",") // ""Objct3","Objct1""
    

    请记住,键的顺序不一定与您声明的Dictionary 相同,因为Dictionary 根据定义是一个无序集合。如果要保持排序,可以使用元组数组而不是 Dictionary,其中元组将由键值对组成。

    【讨论】:

    • { $0.value ? $0.key : nil } 在闭包中,如果你觉得舒服的话。我要补充一点,订单不能保证(不知道用户是否知道,和/或指定)。
    • dict.compactMap { $1 ? $0 : nil } :-)
    • @Larme 你是对的,顺序没有保证,但原始代码也不能保证,因为Dictionary 定义为无序
    • @olejnjak 尽管我通常喜欢简洁,但那段代码牺牲了可读性恕我直言
    • 很酷的方法。唯一的缺点是我错过了\“\”。这是否意味着我仍然需要使用map
    猜你喜欢
    • 2011-01-18
    • 2012-01-23
    • 2021-11-15
    • 1970-01-01
    • 2015-10-17
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多