Swift数组中的值满足条件

xoshrz7s  于 2023-05-12  发布在  Swift
关注(0)|答案(3)|浏览(113)

我有一个数组,我想只获取字段_tisk > 0且_chodnazev =“Předkrm”或“Dezert”的记录。
如何做到这一点?代码如下:

import UIKit

class ViewController: UIViewController {
    
    
    var sorted_polozky = Array<(key: String, value: Array<polozkyUcet>)>()

    struct polozkyUcet: Codable {
        let _id: Int
        let _masterid: Int
        var _rcptid: Int
        var _mnozstvi: String
        var _delene_mnozstvi: String
        let _recept: String
        var _cena: Double
        let _tisk: Int
        var _chod: Int
        var _chodnazev: String
        var _host: String
        var _popis: String
        var _cenazak: Double
    }

   

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let test =  [(key: "Předkrm", value: [polozkyUcet(_id: 456037, _masterid: 145138, _rcptid: 19276, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "ŠKVARKOVÁ POMAZÁNKA", _cena: 85.0, _tisk: -1, _chod: 1, _chodnazev: "Předkrm", _host: "0", _popis: "", _cenazak: 85.0)]), (key: "Hlavní chod", value: [polozkyUcet(_id: 456038, _masterid: 145138, _rcptid: 17828, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "PÁRKY OD KREJCARŮ,BRAMBOROVÁ KAŠE", _cena: 135.0, _tisk: -10, _chod: 10, _chodnazev: "Hlavní chod", _host: "0", _popis: "", _cenazak: 135.0)]), (key: "Dezert", value: [polozkyUcet(_id: 456039, _masterid: 145138, _rcptid: 3047, _mnozstvi: "0,5", _delene_mnozstvi: "0", _recept: "RAKVIČKA SE ŠLEHAČKOU", _cena: 20.0, _tisk: -30, _chod: 30, _chodnazev: "Dezert", _host: "0", _popis: "", _cenazak: 40.0), polozkyUcet(_id: 456112, _masterid: 145138, _rcptid: 1117, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "KAPR FILET NA KMÍNĚ", _cena: 168.0, _tisk: 30, _chod: 30, _chodnazev: "Dezert", _host: "0", _popis: "", _cenazak: 168.0)])]

        sorted_polozky = test
        print(sorted_polozky)   
    }
}
g6ll5ycj

g6ll5ycj1#

要筛选出任何至少有一个元素与筛选器匹配的元组,可以执行以下操作

let result = test.filter {
    $0.value.contains { item in item._tisk > 0 && ["Předkrm", "Dezert"].contains(item._chodnazev) }
}

为了过滤掉并只返回符合条件的元素,我们需要将过滤器 Package 在reduce(into:)中,这样每个元组只过滤一次

let result = test.reduce(into: [(key: String, value: [polozkyUcet])]()) {
    let value = $1.value.filter{ item in item._tisk > 0 && ["Předkrm", "Dezert"].contains(item._chodnazev) }
    if value.isEmpty == false {
        $0.append((key: $1.key, value: value))
    }
}
67up9zun

67up9zun2#

当你有一个polozkhUcet数组时,这应该可以做到:

someArray.filter  { $0._tisk > 0 && ($0._chodnazev == "Předkrm" || $0._chodnazev == "Dezert") }

我无法让你的代码运行,但这对我来说是有效的:

struct polozkyUcet: Codable {
        let _tisk: Int
        var _chodnazev: String
    }

    
    let someArray : [polozkyUcet] = [
        polozkyUcet(_tisk: 1, _chodnazev: "Blah"),
        polozkyUcet(_tisk: 10, _chodnazev: "Předkrm"),
        polozkyUcet(_tisk: 5, _chodnazev: "Dezert"),
        polozkyUcet(_tisk: 0, _chodnazev: "Dezert")
    ]
    
    let selectedElements = someArray.filter  { $0._tisk > 0 && ($0._chodnazev == "Předkrm" || $0._chodnazev == "Dezert") }
7rtdyuoh

7rtdyuoh3#

最后我使用了:
let result = sorted_polozky.map{(key,value)in return value.filter{$0._tisk > 0}}
let filter = result.filter{!$0.isEmpty}
print(filter)

相关问题