arrays - Swift:将二维数组转换为自定义对象数组

标签 arrays swift dictionary

let languages = ["en", "ru", "pt"]

let sheetValues = [["key", "general_ok", "connection_nointernet_message"], ["en", "Ok", "No internet connection"], ["ru", "russianOk", "No internet connection"], ["pt", "portugueseOk", "No internet connection"], ["description", "Ok", "No internet connection"], ["section", "General", "Connection"]]

我可以操纵 sheetValues 作为其转置来获取(如果需要)

我想要的如下:

[
    [
        "isoCode": "en",
        "data": [SheetData("key": "general_ok", "value": "Ok", "description": "Ok", "section": "General"),
                 SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]

    ],
    [
        "isoCode": "ru",
        "data": [SheetData("key": "general_ok", "value": "russianOk", "description": "Ok", "section": "General"),
                 SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]

    ],
    [
        "isoCode": "pt",
        "data": [SheetData("key": "general_ok", "value": "portugueseOk", "description": "Ok", "section": "General"),
                 SheetData("key": "connection_nointernet_message", "value": "No internet connection", "description": "No internet connection", "section": "Conenction")]
    ]
]

型号:

struct Language {
    var isoCode: String?
    var data: [SheetData]?
}

struct SheetData {
    let key: String
    let value: String
    var description: String?
    let section: String
}

这就是我目前所拥有的,任何干净的方法来获取所需的(即[SheetData])?

func fetchLanguages() -> [Language] {
    var allLanguages = [Language]()

    for sheetValue in sheetValues {
        var language = Language()
        var allDataPoints = [SheetData]()

        if let firstElement = sheetValue.first {
            if languages.contains(firstElement) {
                language.isoCode = firstElement
            }
        }

        allLanguages.append(language)
    }

    return allLanguages
}

最佳答案

好的,我已经查看了您的数据并提出了解决方案。最后的结果值应该包含您想要的数组。

        // First create a dictionary with keys for each language
        // In case new languages added or removed
        let languages = ["en", "ru", "pt"]
        var datas: [String: [String: Any]] = [:]
        for language in languages {
            var sheetData: [String: Any] = [:]
            sheetData["isoCode"] = language
            sheetData["data"] = []

            datas[language] = sheetData
        }

        // Get your sheetValues from your source. Here I just used the array you provided.
        let sheetValues = [["key", "general_ok", "connection_nointernet_message"],
                           ["en", "Ok", "No internet connection"],
                           ["ru", "russianOk", "No internet connection"],
                           ["pt", "portugueseOk", "No internet connection"],
                           ["description", "Ok", "No internet connection"],
                           ["section", "General", "Connection"]]

        // Loop the sheetValues starting from index 1 since index 0 holds the key values. 
        for i in 1..<sheetValues.count {
            let languageKey = sheetValues[i][0]
            if datas.keys.contains(languageKey) {
                let firstSheetData = SheetData(key: sheetValues[0][1], // general_ok
                                               value: sheetValues[i][1], // Ok, russianOk etc
                                               description: sheetValues[sheetValues.count - 2][1], // Ok
                                               section: sheetValues[sheetValues.count - 1][1]) // General

                let secondSheetData = SheetData(key: sheetValues[0][2], // connection_nointernet_message
                                                value: sheetValues[i][2], // No internet connection
                                                description: sheetValues[sheetValues.count - 2][2], // No internet connection
                                                section: sheetValues[sheetValues.count - 1][2]) // Connection

                datas[languageKey]["data"] = [firstSheetData, secondSheetData]
            }
        }

        // Loop the dictioanary holding the language datas
        var result: [[String: Any]] = []
        for (key, value) in datas {
            result.append(value)
        }

此解决方案仅适用于某些条件:

  • sheetValues 的索引 0 将始终具有key
  • sheetValues 中倒数第二个索引始终包含 description
  • sheetValues 的最后一个索引将始终具有 section

关于arrays - Swift:将二维数组转换为自定义对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100986/

相关文章:

javascript - 从 JSON 数组的数组属性中提取值

javascript - js平面数组到多级数组

java - 无效的流 header : EFBFBDEF when converting object from byte string

arrays - 在对象数组中找到最近的项目?

ios - 在协议(protocol)扩展中添加目标操作失败

Javascript 全局变量作用域/覆盖拼接

objective-c - 从 Objective-C 协议(protocol)实例匹配 Swift 协议(protocol)

java - 使用 Java 中的映射实现的队列数据结构,大小限制为 5

python - 从 Python 字典中弹出许多元素的最佳方法

python - 仅当字符串匹配时才在 python 中连接字符串