Ios 对JSON进行排序,以查找字符串不同的每个实例
我试图发现字符串Ios 对JSON进行排序,以查找字符串不同的每个实例,ios,json,swift,jsondecoder,Ios,Json,Swift,Jsondecoder,我试图发现字符串名称:的每个实例都不同 至于下面的JSON示例,我想将Alamo Draft House Lamar和Alamo Draft House Ritz放在一个数组中 JSON: 以下是我的api代码: var shows = [Shows]() struct Shows: Codable { let showtimes: [Showtimes] struct Showtimes: Codable { let theatre: Theater
名称:
的每个实例都不同
至于下面的JSON示例,我想将Alamo Draft House Lamar和Alamo Draft House Ritz放在一个数组中
JSON:
以下是我的api代码:
var shows = [Shows]()
struct Shows: Codable {
let showtimes: [Showtimes]
struct Showtimes: Codable {
let theatre: Theater
struct Theater: Codable {
let id: String
let name: String
}
}
}
func loadShowtimes() {
let apiKey = ""
let today = "2018-11-10"
let zip = "78701"
let filmId = "MV011110340000"
let radius = "15"
let url = URL(string: "http://data.tmsapi.com/v1.1/movies/\(filmId)/showings?startDate=\(today)&numDays=5&zip=\(zip)&radius=\(radius)&api_key=\(apiKey)")
let request = URLRequest(
url: url! as URL,
cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData,
timeoutInterval: 10 )
let session = URLSession (
configuration: URLSessionConfiguration.default,
delegate: nil,
delegateQueue: OperationQueue.main
)
let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
if let data = data {
do { let shows = try! JSONDecoder().decode([Shows].self, from: data)
self.shows = shows
}
}
})
task.resume()
}
我如何对数组进行排序,并找到每个不同的
名称实例:
,然后将每个名称放入一个新的数组中?有几种方法可以迭代您的节目数组和它们的剧院数组,以获得完整的名称列表。一旦您拥有完整的姓名列表,您就可以获得这些姓名的唯一列表
以下是一种方法:
let names = Array(Set(shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }))
让我们把它分开,以便更好地解释发生了什么
let allNames = shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }
let uniqueNames = Array(Set(allNames))
shows.map在shows
中迭代每个shows
。内部映射
依次迭代每个剧院
中的每个显示
并返回其名称
。因此,内部的map
给出了一个名称数组。第一个map
生成一个名称数组。reduce
将这些名称数组合并为一个名称数组,而allNames
则使用一个包含每个名称的数组
使用Array(Set(allNames))
首先创建一组唯一的名称,然后从该集合创建一个数组
如果希望最终结果按字母顺序排序,请在末尾添加.sorted()
如果需要保留原始顺序,可以使用sorderedset
并删除sortedset
的任何使用
let names = NSOrderedSet(array: shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }).array as! [String]
有几种方法可以迭代您的节目数组
及其剧院数组
,以获得完整的姓名列表。一旦您拥有完整的姓名列表,您就可以获得这些姓名的唯一列表
以下是一种方法:
let names = Array(Set(shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }))
让我们把它分开,以便更好地解释发生了什么
let allNames = shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }
let uniqueNames = Array(Set(allNames))
shows.map在shows
中迭代每个shows
。内部映射
依次迭代每个剧院
中的每个显示
并返回其名称
。因此,内部的map
给出了一个名称数组。第一个map
生成一个名称数组。reduce
将这些名称数组合并为一个名称数组,而allNames
则使用一个包含每个名称的数组
使用Array(Set(allNames))
首先创建一组唯一的名称,然后从该集合创建一个数组
如果希望最终结果按字母顺序排序,请在末尾添加.sorted()
如果需要保留原始顺序,可以使用sorderedset
并删除sortedset
的任何使用
let names = NSOrderedSet(array: shows.map { $0.showtimes.map { $0.theatre.name }}.reduce([]) { $0 + $1 }).array as! [String]
这是可行的,但不是按字母顺序排序。按照它们出现的顺序对它们进行排序的正确方法是什么?每次运行应用程序时,我的名字总是以不同的随机顺序排序。@JSharpp使用Set
会导致名字顺序混乱。请使用sensorderedset
查看我的更新答案,以保持原始顺序。我将错误从“sensorderedset”转换为不相关类型“[String]始终失败
您是否完全按照我的方式复制了该行?这对我来说很好。听起来你错过了接近尾声的.array
。这就是你错过的。我在第二行创建了数组,但确实遗漏了这一部分。这样做有效,但没有按字母顺序排序。按照它们出现的顺序对它们进行排序的正确方法是什么?每次运行应用程序时,我的名字总是以不同的随机顺序排序。@JSharpp使用Set
会导致名字顺序混乱。请使用sensorderedset
查看我的更新答案,以保持原始顺序。我将错误从“sensorderedset”转换为不相关类型“[String]始终失败
您是否完全按照我的方式复制了该行?这对我来说很好。听起来你错过了接近尾声的.array
。这就是你错过的。我在第二行上创建了数组,但确实遗漏了该部分。