сортировать и перечислять массив JSON по свойству в swift - PullRequest
0 голосов
/ 29 октября 2018

У меня есть следующий массив json

[
  {
    "name" : "v1",
    "available" : 1
  },
  {
    "name" : "v2",
    "available" : 3
  },
  {
    "name" : "v3",
    "available" : 2
  },
  {
    "name" : "v4",
    "available" : 3
  },
  {
    "name" : "v5",
    "available" : 3
  },
  {
    "name" : "v6",
    "available" : 1
  },
  {
    "name" : "v7",
    "available" : 2
  }
]

в наличии показать несколько цифр, что означает: 1 и 3 в порядке 2 не в порядке

Как мне упорядочить этот массив json по доступному значению, показывая сначала значения 1 и 3, а последнее - значение 2. Список результатов должен выглядеть следующим образом:

[
  {
    "name" : "v1",
    "available" : 1
  },
  {
    "name" : "v6",
    "available" : 1
  },
  {
    "name" : "v2",
    "available" : 3
  },
  {
    "name" : "v4",
    "available" : 3
  },
  {
    "name" : "v5",
    "available" : 3
  },
  {
    "name" : "v3",
    "available" : 2
  },
  {
    "name" : "v7",
    "available" : 2
  }
]

Как я могу это сделать?

Примечание: я использую swiftyJson

Это мой код:

sortArrayOddsBeforeEvens(array: json_array)

func sortArrayOddsBeforeEvens(array: JSON){
  let odds = array.filter{ $0.1["available"].intValue % 2 != 0 }
  let evens = array.filter{ $0.1["available"].intValue % 2 == 0 }
  print(odds)
  print(evens)
}

Как я могу вернуть это как JSON?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы собираетесь отсортировать массив по двум критериям.

Предложение или обычный алгоритм: сначала сортируйте по нечетному / четному, если оба значения равны, сортируйте по целочисленному значению.

let array = [["name" : "v1", "available" : 1],["name" : "v6", "available" : 1],["name" : "v2", "available" : 3],["name" : "v4", "available" : 3],["name" : "v5", "available" : 3],["name" : "v3", "available" : 2],["name" : "v7", "available" : 2]]

let sortedArray = array.sorted { (d1, d2) -> Bool in
    let avail1 = d1["available"] as! Int
    let avail2 = d2["available"] as! Int
    let compareOddity = avail1 % 2 == 0 && avail2 % 2 != 0
    if compareOddity { return !compareOddity }
    return avail1 < avail2
}

print(sortedArray)

Два избегают отвратительного шаблонного отбрасывания кода SwiftyJSON и используют Decodable для декодирования JSON в структуры.
Код будет выглядеть намного чище (и более эффективно)

let sortedArray = array.sorted { (d1, d2) -> Bool in
    let compareOddity = d1.available % 2 == 0 && d2.available % 2 != 0
    if compareOddity { return !compareOddity }
    return d1.available < d2.available
}
0 голосов
/ 29 октября 2018
var array: [Int] = [1, 3, 2, 2, 1, 3, 3, 1, 2, 1, 3, 2, 2, 1]
array.filter({ return $0 != 2 }) + array.filter({ return $0 == 2})

В основном логика та же.

let data = """
[
{ "name" : "v1", "available" : 1 },
{ "name" : "v2", "available" : 3 },
{ "name" : "v3", "available" : 2 },
{ "name" : "v4", "available" : 3 },
{ "name" : "v5", "available" : 3 },
{ "name" : "v6", "available" : 1 },
{ "name" : "v7", "available" : 2 }]
""".data(using: .utf8)!

let array = JSON(data).arrayValue
let result = array.filter({ return $0["available"].intValue != 2}) + array.filter({ return $0["available"].intValue == 2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...