Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在swift中按属性排序和列出JSON数组_Json_Swift - Fatal编程技术网

在swift中按属性排序和列出JSON数组

在swift中按属性排序和列出JSON数组,json,swift,Json,Swift,我有以下json数组 [ { "name" : "v1", "available" : 1 }, { "name" : "v2", "available" : 3 }, { "name" : "v3", "available" : 2 }, { "name" : "v4", "available" : 3 }, { "name" : "v5", "available" : 3

我有以下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返回

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

您将按照两个条件对数组进行排序

建议:通常的算法:首先按奇偶排序,如果两个值相等,则按整数值排序

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)

创建自定义元素并在添加后对其进行排序。您可以编写一段代码吗?我需要使用json数组,在逻辑上没有太大差异。如果值在
1…3
范围内,您的代码工作得很好,但如果有其他值,它将失败。@vadian似乎只有3种情况?所有@Ryan必须做的就是让所有值都能工作将这些过滤条件更改为
返回$0%2==0
表示偶数,将
返回$0%2==1
表示赔率。聪明的方法。(表决)
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
}