сгладить массив словарей с двойными значениями Swift 3.0

57
6

У меня есть набор таких словарей:

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)
}
}

но это устранит дубликаты kies и просто вернет последние значения. вывод вышеуказанного кода:

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انساني",
]

любая помощь будет оценена

спросил(а) 2017-07-24T14:00:00+03:00 3 года, 2 месяца назад
1
Решение
57

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)

ответил(а) 2017-09-07T16:44:00+03:00 3 года назад
58

Из ваших комментариев мы, наконец, получаем то, что вы пытаетесь сделать, - вы хотите превратить ваши слова arrayOfDictionaries в String чтобы отправить его с запросом.

Он может различаться в зависимости от того, как именно вы хотите, чтобы он выглядел, но если вы хотите превратить свой arrayOfDictionaries в 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)

ответил(а) 2017-07-24T14:24:00+03:00 3 года, 2 месяца назад
41

Хотя я тоже не понял, чего именно вы пытаетесь достичь, но, как вы отметили в комментарии, чтобы 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
}

ответил(а) 2017-07-24T14:22:00+03:00 3 года, 2 месяца назад
40

Словари предназначены для использования с уникальными ключами, вероятно, что процесс не устраняет дубликаты ключей, но само создание, класс словаря даже имеет функцию для создания словаря, определяющего правила, для определения того, какое значение следует принимать как правильное из дублированных записей.

ответил(а) 2017-07-24T14:09:00+03:00 3 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема