将字典映射到数组到字符串

Map dictionary to array to string

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

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

目前我正在使用四个函数(过滤、枚举、映射和连接),虽然我得到了想要的结果,但我想知道我是否需要所有这些函数:

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

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

您可以使用单个 compactMap,因为首先您需要 filter 您的 Dictionary 只保留 true 值,然后您需要到 map 到 return key 对应于 true 值。但是,您始终可以将后续的 filtermap 调用合并为单个 compactMap,因为 compactMap 仅保留 non-nil 值,而不是 return 像 filter 一样输入一个布尔值,如果你的条件计算结果为真,你 return 无论你在 map 中 return,否则你 return 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,其中元组将由键值对组成。