skip to Main Content

i have to filter dictionary containing my text inside of textfield
//my code

var arrayData = [["Name":"Sahil"],["Name":"Raman"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Deep"],["Name":"sahil"],["Name":"Swift"]]
//my result should be  like this
[["Name":"Sahil"],["Name":"ashish"],["Name":"Vishnu"],["Name":"Swift"]]

2

Answers


  1. This should work:

    var arrayDataFiltered = arrayData.filter { $0["Name"]?.lowercased().contains("s") ?? false }
    

    Here is the documentation for filtering:
    https://developer.apple.com/documentation/swift/sequence/3018365-filter

    Login or Signup to reply.
  2. It was unclear, you explained it later in comments, but you want to keep the values for key "Name" which contains an "s" case insensitive.

    Let’s add a couple of additional values to show why your previous attempts failed:

    var arrayData = [["Name":"Sahil"],
                     ["Name":"Raman"],
                     ["Name":"ashish"],
                     ["Name":"Vishnu"],
                     ["Name":"Deep"],
                     ["Name":"sahil"],
                     ["Name":"Swift"],
                     ["Name":"s"],
                     ["Name":"S"]]
    

    And simplify:

    let searchText = "s" // textField.text ?? ""
    

    You attempted:

    let filteredArray1 = arrayData.filter { $0["Name"] == searchText }
    print(filteredArray1)
    

    Output:

    $> [["Name": "s"]]
    

    So, you get only when value is exactly equals to "s", that’s normal, you are using ==

    You then attempted:

    let filteredArray2 = arrayData.filter { $0["Name"]!.contains(searchText) }
    print(filteredArray2)
    

    Output:

    $>[["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "s"]]
    

    So, you are getting anyvalues when it has a "s" inside it. It’s almost that, but you aren’t getting when it has an uppercase "S".
    To do that, you can use range(of:options:searchRange:local:) with .caseInsensitive optiono. If the result isn’t nil, it means it has been found.

    So you can use:

    let filteredArray3 = arrayData.filter { $0["Name"]?.range(of: "s", options: .caseInsensitive) != nil }
    print(filteredArray3)
    

    Output:

    $>[["Name": "Sahil"], ["Name": "ashish"], ["Name": "Vishnu"], ["Name": "sahil"], ["Name": "Swift"], ["Name": "s"], ["Name": "S"]]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search