如何对来自 Alamofire 的 JSON 和 return 最终 JSON 对象进行排序(快速 JSON)

How to sort JSON coming from Alamofire and return final JSON object (swiftyJSON)

我无法简洁地从 api 中提取数据,将用户当前位置添加到对象中,然后根据计算的距离对数据进行排序。

Whosebug 问题并没有完全回答我面临的问题。看这里:How to sort posts read from JSON server file in Swift.

我目前正在从 Alamofire 加载 api 数据并使用 UITableViewController 呈现该数据。

    override func viewDidLoad() {
    super.viewDidLoad()
    titleLabel.title = q.capitalizedString
    Alamofire.request(.GET, "http://www.thesite.com/api/v1/things", parameters: ["q" : q])
        .responseJSON { response in
            let JSONObject = JSON(response.result.value!)
            self.results = JSONObject["things"]
            for (key, _) in self.results {
                let intKey: Int = Int(key)!
                var thisItem: JSON = self.results[intKey]
                let geoLat = thisItem["place"][0]["location"]["geo"][1].double ?? 37.763299
                let geoLong = thisItem["place"][0]["location"]["geo"][0].double ?? -122.419356
                let destination = CLLocation(latitude: geoLat, longitude: geoLong)
                let setLocation = CLLocation(latitude: self.currentLocation.latitude, longitude: self.currentLocation.longitude)
                let distanceBetween: CLLocationDistance = destination.distanceFromLocation(setLocation)
                thisItem["distance"].double =  distanceBetween
                self.results[intKey] = thisItem
            }
            self.tableView.reloadData()
    }
}

我从api获取数据并成功添加了用户所在位置与目的地目的地之间的距离。

但是,现在我需要对 JSON 对象 (SwiftyJSON) 从最低到最高的距离进行排序。这就是我卡住的地方。

重新加载 tableView(作为 JSON 对象)时的数据结构本质上是:

results = [
{"title": "Chai", "distance": "1245.678575"},
{"title": "Espresso", "distance": "765845.678575"},
{"title": "Drip Coffee", "distance": "23445.678575"}
...
]

我怎样才能:1) 将对象转换为 NSArray 并排序;或者 2) 只是对对象进行排序?什么时候是进行距离添加和排序的最佳位置 - 我应该在转换为 JSON 对象之前进行吗?

感谢任何帮助!谢谢!

如果results是一个SwiftyJSON对象,你可以用.arrayValue提取它的数组。

let resultsArray = results.arrayValue

然后一旦你有了一个普通的字典数组,你就可以用 sort 对数组进行排序,如下所示:

let sortedResults = resultsArray.sort { [=11=]["distance"].doubleValue < ["distance"].doubleValue }

我拿了你的JSON片段:

并使用 Swifty 在 Playground 中测试了我的答案JSON:


如果你愿意,你也可以直接对 SwiftyJSON 对象进行排序:

let sortedResults = results.sort { [=12=].0.1["distance"].doubleValue < [=12=].1.1["distance"].doubleValue }.map { [=12=].1 }

但我发现它作为源代码的可读性较差。

Swift 3 & Swift 4

let sortedResults = finalJsonArray.sorted { [=10=]["count"].doubleValue < ["count"].doubleValue }

Swift 3 + Swift 4 我找到的最短解决方案如下:

< 是升序排序,
> 正在降序排序

它对 (String,JSON) 格式的排序特别有效(当你使用 SwiftyJSON 时)

let sortedResults = json.sorted(by: < )