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
。这就是你错过的。我在第二行上创建了数组,但确实遗漏了该部分。