Kuldeep
Kuldeep

Reputation: 4552

How to filter item from NSObject Array

Below is my 2 Objects

Muscle

struct MuscleListObject {
    var strMuscleName: String = ""
    var arrMuscleExercise: [MuscleExerciseListObject] = []
}

ExerciseObject

struct MuscleExerciseListObject {
    var strExerciseName: String  = ""
}

I know the Muscle wise filter but i want to search item exercise wise. how can I do this? please guid me about this.

arrSearchedMuscle = self.arrExercise.filter({ objMuscle in
    if let name = objMuscle.strMuscleName as? String, let query = searchBar.text {
        return name.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil
    }
    return false
})

EDIT

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText.count == 0 {
            isSearching = false
            arrSearchedMuscle = arrExercise
        }
        else {
            isSearching = true

            let query = searchText
            arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
                if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
                    return category
                } else {
                    arrSearchedExercise = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
                    if arrSearchedExercise.isEmpty {
                        return nil
                    } else {
                        let newCategory = category
                        newCategory.arrMuscleExercise = arrSearchedExercise
                        return newCategory
                    }
                }
            }
            print(arrExercise)
            print(arrSearchedMuscle)
        }
        self.tblVWExercise.reloadData()
    }

Please guide me about the filter call. Thanks in advance

Upvotes: 1

Views: 227

Answers (1)

RajeshKumar R
RajeshKumar R

Reputation: 15748

If Muscle title contains search query return whole Muscle object. If not filter Exercise objects with search query and return updated Muscle object. If particular Muscle object doesn't contain search query return nil

let query = "band"
arrSearchedMuscle = arrExercise.compactMap { category -> MuscleListObject? in
    if category.strMuscleName.range(of: query, options: [.caseInsensitive]) != nil {
        return category
    } else {
        let filteredItems = category.arrMuscleExercise.filter({ $0.strExerciseName.range(of: query, options: [.caseInsensitive]) != nil  })
        if filteredItems.isEmpty {
            return nil
        } else {
            var newCategory = category
            newCategory.arrMuscleExercise = filteredItems
            return newCategory
        }
    }
}
print(arrExercise)
print(arrSearchedMuscle)

enter image description here

Upvotes: 1

Related Questions