迅速按属性排序和列出JSON数组

时间:2018-10-29 20:00:48

标签: json swift

我有以下json数组

$sound = base64_encode( file_get_contents( $_FILES["sound"]["tmp_name"] ) );

可用显示一些数字,表示: 1和3还可以 2不好

如何按可用值对json数组进行排序,首先显示1和3值,最后显示2值。结果列表应如下所示:

[
  {
    "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
  }
]

我该怎么做?

注意:我使用swiftyJson

这是我的代码:

[
  {
    "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
  }
]

如何将其返回为JSON?

2 个答案:

答案 0 :(得分:1)

您将根据两个条件对数组进行排序。

建议又是常用算法:如果两个值均相等,则首先按奇数/偶数排序。

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
}

答案 1 :(得分:0)

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