簡體   English   中英

如何通過NSDictionary中的Key:value過濾NSArray

[英]How to filter a NSArray by Key:value, that is in a NSDictionary

我試圖找出如何通過值“名稱”過濾掉NSArrays字典

// Is an Array of a dictionary, by key : values

var teamFilteredList = [[String:Any]]()
var teamList = [[String:Any]]() 

取:

    let string = "https://api/connect/"
    let url = NSURL(string: string)
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "GET"
    let session = URLSession.shared
    let tache = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSArray {
            print(jsonObj)
            teamList = jsonObj as! [[String : Any]]

            DispatchQueue.main.async {
                self.teamCollectionView.reloadData()
            }
        }
    }
    tache.resume()

此代碼是結果,並將其放入teamList

JSON:

({
    id = 1;
    logo = "testLogo";
    name = "testTeam1";
    "url" = "https://example.com";
},
    {
    id = 2;
    logo = "testLogo";
    name = "testTeam2";
    "url" = "https://example.com";
},
    {
    id = 3;
    logo = "testLogo";
    name = "testTeam3";
    "url" = "https://example.com";
})

放入teamList后的外觀示例:

let example = [[id: "1", logo: "image", name: "testTeam1", url: "https"], [id: "2", logo: "image", name: "testTeam2", url: "https"]] 

嘗試過濾的代碼:

 let array2Name = teamFilteredList.flatMap { $0["name"] }
    teamFilteredList = teamList.reduce(teamFilteredList, { result, value in
        !array2Name.contains(where: { $0 as! _OptionalNilComparisonType == value["testTeam3"] }) ? result + [value]: result
    })

到目前為止,這段代碼太可怕了。 但是網上沒有別​​的告訴我怎么干的。 所以我被困住了。

導致崩潰:

無法轉換類型'__NSCFString'的值

更新:

我有一個收集視圖,該收集視圖是通過NSURL從獲取中填充的,該視圖為我提供了一個充滿NSArrays的Dictionary,並且我想通過該鍵將NSArray Indexes中已有的值過濾出該字典中的所有NSArray索引:名稱”

此鏈接的最終答案中已回答問題,但不是最新的,並會產生錯誤。 這里

如此,使用自定義結構和JSONDecoder變得非常容易

創建一個結構

struct Team : Decodable {
    let id : Int
    let logo : String
    let name : String
    let url : URL
}

創建數組

var teamList = [Team]()
var teamFilteredList = [Team]()

解碼JSON

let string = "https://api/connect/"
let url = URL(string: string)!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error { print(error); return }
    do {
        self.teamList = try JSONDecoder().decode([Team].self, from: data!)
        DispatchQueue.main.async {
            self.teamCollectionView.reloadData()
        }
    } catch {
        print(error)
    }
}
task.resume()

並過濾數組

teamFilteredList = teamList.filter{ $0.name == "testTeam3" }

嘗試使用此謂詞

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { $0 == fromDict["name"] as? String ?? ""})})

訣竅在於,Swift的錯誤表達能力不足。 它說不don't use where ,為什么呢? 因為編譯器確實需要一個String,因為您的關閉不正確。

並且如果array2Name也是一個字典。 嘗試將where子句更改為:

where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") }

因此整個功能將是:

teamFilteredList.filter({ fromDict in return !array2Name.contains(where: { ($0["name"] as? String ?? "<<Empty1>>") == (fromDict["name"] as? String ?? "<<Empty2>>") })})

如果您想學習更有效的函數式編程並且不介意使用JavaScript,請嘗試以下方法

學習使用JavaScript進行有效的函數式編程)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM