【问题标题】:flatten array of dictionaries with duplicate values Swift 3.0展平具有重复值的字典数组Swift 3.0
【发布时间】:2017-12-29 22:31:41
【问题描述】:

我有一个这样的字典数组:

let arrayofDictionaries:[[String:Any]] = [
    ["nationalCode": "1570158037", "bookId": 327, "orderDate": "2017-07-24 14:11:52", "mobileNo": "09873456789", "isFavorite": false, "price": 45000, "bookName": "آموزش عربي انساني نکته ها"],
    ["nationalCode": "1570158037", "bookId": 366, "orderDate": "2017-07-24 14:11:58", "mobileNo": "09873456789", "isFavorite": false, "price": 19000, "bookName": "آبي عربي پيش1و2انساني"],
    ["nationalCode": "1570158037", "bookId": 327, "orderDate": "2017-07-24 14:11:52", "mobileNo": "09873456789", "isFavorite": false, "price": 45000, "bookName": "آموزش عربي انساني نکته ها"],
    ["nationalCode": "1570158037", "bookId": 366, "orderDate": "2017-07-24 14:11:58", "mobileNo": "09873456789", "isFavorite": false, "price": 19000, "bookName": "آبي عربي پيش1و2انساني"],
]

数组中的字典有固定的键值会改变。 我试过这段代码:

for item in arrayofDictionaries {
    for (kind, value) in item {
        print(kind)
        dic.updateValue(value!, forKey: kind)
    }    
}

但这会消除重复的凯斯并只返回最后一个值。 上述代码的输出将是:

dic = ["nationalCode": "1570158037", "bookId": 366, "orderDate": "2017-07-24 14:11:58", "mobileNo": "09873456789", "isFavorite": false, "price": 19000, "bookName": "آبي عربي پيش1و2انساني"]

我想要的是这样的字典:

let flattenedArray : [String : Any] = [
    "nationalCode": "1570158037", "bookId": 327, "orderDate": "2017-07-24 14:11:52", "mobileNo": "09873456789", "isFavorite": false, "price": 45000, "bookName": "آموزش عربي انساني نکته ها",
    "nationalCode": "1570158037", "bookId": 366, "orderDate": "2017-07-24 14:11:58", "mobileNo": "09873456789", "isFavorite": false, "price": 19000, "bookName": "آبي عربي پيش1و2انساني",
    "nationalCode": "1570158037", "bookId": 327, "orderDate": "2017-07-24 14:11:52", "mobileNo": "09873456789", "isFavorite": false, "price": 45000, "bookName": "آموزش عربي انساني نکته ها",
    "nationalCode": "1570158037", "bookId": 366, "orderDate": "2017-07-24 14:11:58", "mobileNo": "09873456789", "isFavorite": false, "price": 19000, "bookName": "آبي عربي پيش1و2انساني",
]

任何帮助将不胜感激

【问题讨论】:

  • “我想要的是这样的字典”——你不能有这样的字典,句号。 Dictionary 的键是唯一的,每个键都指向一个值。你想用这样的字典来达到什么目的?
  • 正如@mag_zbc 所说,“你想达到什么目标?”,我们可以为你推荐替代方案。
  • @mag_zbc 我正在尝试发帖请求。它应该变成一个字符串。
  • “它应该变成一个字符串”到底是什么意思?举一个你的帖子请求的例子。
  • 这是我的 Web 服务所需的 POST /newsite/Common/WebService/WSPublicApp.asmx/InsertFactor HTTP/1.1 主机:city.kanoon.ir 内容类型:application/x-www-form -urlencoded Content-Length: 长度 FactorInfo=string HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length tempuri.org/">string</string> 。我想我应该发布一个请求字符串。我希望该 arrayofDictionaries 更改为字符串,以便我可以执行发布请求。我是这个发布内容的新手,很抱歉 Unclearity。

标签: ios arrays swift dictionary swift3


【解决方案1】:
do {
        let data = try JSONSerialization.data(withJSONObject: JsoonFactor, options: .prettyPrinted)
        let jsonString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
        let jr = (jsonString?.replacingOccurrences(of: "\n", with: "", options: .regularExpression))!
        let jrrr = jr.removingWhitespaces()
        let urlEncodedJson = jrrr.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)

【讨论】:

    【解决方案2】:

    从您的 cmets 中,我们终于知道您想要做什么 - 您想将您的 arrayOfDictionaries 转换为 String 以发布请求。

    它可能会有所不同,具体取决于您希望它的外观,但如果您想将您的 arrayOfDictionaries 转换为字符串,您可以这样做

    var aString : String = ""
    for aBook in arrayOfDictionaries {
        if let nationalCode = aBook["nationalCode"] {
            aString.append("nationalCode : " + nationalCode + ", ")
        }
        if let bookId = aBook["bookId"] {
            aString.append("bookId : " + bookId + ", ")
        }
        // and so on, and so forth
    }
    

    为什么要手动进行,而不是在字典上使用(key, value) 进行迭代?不幸的是,由于Dictionary 被实现为哈希映射,因此无法保证在迭代时您的键会以与声明字典时相同的顺序出现(实际上,几乎可以保证顺序会有所不同)。

    但同样,这是您的字符串需要具有的格式问题。如果顺序无关紧要,只需使用 (key, value) 进行迭代

    【讨论】:

    • 我需要 flattenedArray 中的格式。此代码的输出没有括号或双层
    【解决方案3】:

    虽然我也不明白你到底想达到什么目的,但正如你在评论中提到的,create a URL string from a dictionary,只需使用:

    func urlString() -> String
        {
            var string = ""
    
            for key in self.keys
            {
                if let value = self[key]
                {
                    string += "&\(key)=\(value)"
                }
            }
            return string
        }
    

    【讨论】:

    • 是的,我想添加一个 URL 字符串。这适用于 [[String : Any]] 吗?或者只是 [String : Any]
    • 您编写的方法不适用于字典数组,它仅适用于字典
    • 是的,它将字典转换为字符串。要转换字典数组,请遍历数组并附加相应的字符串。
    【解决方案4】:

    字典旨在与唯一键一起使用,该过程可能不是消除重复键而是创建本身,字典类甚至具有创建字典的功能,定义规则以决定取哪个值作为重复条目中的正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      相关资源
      最近更新 更多