2016-11-25 3 views
-1

Я искал эту проблему, и я не нашел решения, которое работает для меня, используя последнюю версию Xcode и Swift. Я использую три массива:Как фильтровать массив структур со значением другого массива в swift?

1. baseArray[Meal]: array filled with every meal. Not locally saved. 

2. favoritesArray[Favorite]: with names of all favorite meals, locally saved by the user with NSKeyedArchiver. 
3. filteredArray[Meal]: baseArray but filtered for searchterm. In code: 

    (filteredArray = baseArray.filter { $0.type == searchtext }} 

я использую последний массив в tableView. Если они хотят видеть все блюда, то filteredArray - это то же самое, что и baseArray.

Мой вопрос: как я могу получить filteredArray, что он имеет все любимые блюда (так где Meal.title == Favorite.name). Как объединить три массива?

Я пробовал много вариантов на прошлой неделе, но никто не работал. Надеюсь, вы можете мне помочь!

+0

'filterArray = baseArray.filter {$ 0.type == текст поиска && избранноеArray.contains ($ 0.type)}'? (вы можете конвертировать избранноеArray в 'Set') – hnh

ответ

0

Это делает то, что вы хотите:

struct Meal { 
    let title: String 
} 

struct Favorite { 
    let name: String 
} 

let meal1 = Meal(title: "Soup") 
let meal2 = Meal(title: "Stew") 
let meal3 = Meal(title: "Pizza") 

let favorite1 = Favorite(name: "Stew") 

let baseArray = [meal1, meal2, meal3] 
let favoritesArray = [favorite1] 

let favoriteNames = favoritesArray.map { $0.name } 

let filteredArray = baseArray.filter { favoriteNames.contains($0.title) } 
+0

Thx много! Это работает; У меня уже был избранноеArray, поэтому мне не нужно было объявлять его снова. Любимые имена делают трюк! – mkw1975

0

Это решение для вас, если я правильно понял ваш вопрос.

struct Meal { 
    let name: String 
} 

struct Favorite { 
    let name: String 
} 

let baseArray = [Meal(name: "Meal1"), Meal(name: "Meal2"), Meal(name: "Meal3")] 

let favoritesArray = [Favorite(name: "Meal1")] 

let searchText = "Meal3" 

let filteredArray = baseArray.filter { $0.name == searchText } 
print(filteredArray) 
// [Meal(name: "Meal3")] 

let combinedArray = baseArray.reduce(filteredArray) { array, element in 
    // First condition check if the current meal (element) in contained in the favorites 
    // Second checks if the favorite meal isn't already in the filteder array 
    if favoritesArray.contains(where: { $0.name == element.name }) && 
     !filteredArray.contains(where: { $0.name == element.name }) { 
     return array + [element] 
    } 
    return array 
} 

print(combinedArray) 
// [Meal(name: "Meal3"), Meal(name: "Meal1")] 
Смежные вопросы