代码之家  ›  专栏  ›  技术社区  ›  Govaadiyo

从字典数组中搜索结果的最佳方法

  •  0
  • Govaadiyo  · 技术社区  · 7 年前

    正如我的标题所说,从字典数组中搜索结果的最佳方法是什么?

    前任。

    let array = [
        ["name": "Amit", "age": "27", "rollno": 12],
        ["name": "Ananad", "age": "26", "rollno": 10],
        ["name": "Kashyap", "age": "25", "rollno": 11],
        ["name": "Raj", "age": "25", "rollno": 07],
        ["name": "Akshya", "age": "28", "rollno": 13]
    ]
    

    我想搜索 “名称” 基于用户输入。看看下面我做的事情。

    let strSeach = "k"
    let searchResult = myArray.filter{String(($0["name"] as! String).characters.prefix(strSeach.characters.count)).lowercased() == strSeach.lowercased()}
    
    print("index => \(searchResult)")
    

    输出为:

    搜索结果=>[“rollno”:11,“name”:“Kashyap”,“age”:“25”]]

    但困惑的是,这是正确的搜索方式吗?我用过 characters.prefix , lowercased()

    如果我想应用多个搜索,比如按“姓名”、“年龄”等进行搜索,那么我们如何在 swift过滤器?

    NSPredicate 使用Swift Array ? 否则,我们可以通过以下方式实现

    let searchPredicate = NSPredicate(format: "name CONTAINS [c] %@ OR age CONTAINS [c]", strSeach)
    

    像那样!

    4 回复  |  直到 7 年前
        1
  •  1
  •   Sweeper    7 年前

    NSPredicate 如果需要,请注意它比 filter .

    您只需将swift数组转换为 NSArray filtered .

    此外,这里还有另一种使用swift过滤器的方法:

    let searchResult = array.filter { 
        ($0["name"] as! String).lowercased().hasPrefix(strSeach.lowercased()) }
    
        2
  •  1
  •   Prashant Tukadiya    7 年前

    带过滤器

    你可以用这个

    let array = [
    ["name": "Amit", "age": "27", "rollno": 12],
    ["name": "Ananad", "age": "26", "rollno": 10],
    ["name": "Kashyap", "age": "25", "rollno": 11],
    ["name": "Raj", "age": "25", "rollno": 07],
    ["name": "Akshya", "age": "28", "rollno": 13]
    ]
    
    let searchSting = "am"
    
    var search = array.filter { ($0["name"] as!    String).lowercased().contains(searchSting.lowercased()) }
    

    输出

    [["rollno": 12, "name": "Amit", "age": "27"]]
    

    带谓词

    let searchPredicate = NSPredicate(format: "name CONTAINS [c] %@ OR age == %@", searchSting)
    search = array.filter { searchPredicate.evaluate(with: $0)}
    

    [“rollno”:12,“name”:“Amit”,“age”:“27”]]
    
        3
  •  1
  •   Luca Angeletti    7 年前

    您应该使用模型值

    struct Person {
    
        let name: String
        let age: Int
        let rollno: Int
    
        init?(dict:[String:Any]) {
            guard
                let name = dict["name"] as? String,
                let ageText = dict["age"] as? String,
                let age = Int(ageText),
                let rollno = dict["rollno"] as? Int
                else { return nil}
    
            self.name = name
            self.age = age
            self.rollno = rollno
        }
    }
    

    现在,给定您的初始阵列

    let data = [
        ["name": "Amit", "age": "27", "rollno": 12],
        ["name": "Ananad", "age": "26", "rollno": 10],
        ["name": "Kashyap", "age": "25", "rollno": 11],
        ["name": "Raj", "age": "25", "rollno": 07],
        ["name": "Akshya", "age": "28", "rollno": 13]
    ]
    

    Person(s)

    let persons = data.flatMap(Person.init)
    

    姓名包含字符串的人员

    现在过滤部分很简单,看

    let personsWhereNameContainsK = persons.filter { $0.name.lowercased().contains("k") }
    

    后果

    [
        Person(name: "Kashyap", age: 25, rollno: 11),
        Person(name: "Akshya", age: 28, rollno: 13)
    ]
    
        4
  •  0
  •   Venk    7 年前

    您可以使用 contains 过滤器中的关键字如下,

    let searchResult = myArray.filter{String(($0["name"] as! String).lowercased().contains(strSeach.lowercased())}
    

    对于多个过滤器(我根据您的谓词添加条件),

    let searchResult = myArray.filter{(String(($0["name"] as! String).lowercased().contains(strSeach.lowercased())) || (String(($0["age"] as! String).lowercased().contains(strSeach.lowercased()))}