2016-11-25 70 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中的最后一个数组。如果他们想要看到所有餐点,则filteredArraybaseArray相同。

我的问题:我怎么能得到filteredArray,它有所有喜爱的食物(所以在哪里Meal.title == Favorite.name)。我如何结合三个阵列?

我在上周尝试了很多选择,但都没有工作..我希望你能帮助我!

+0

'filteredArray = baseArray.filter {$ 0.type == search text && favoritesArray.contains($ 0.type)}'? (你可能想首先将favoritesArray转换为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很多!这是工作;我已经有了一个favoriteArray,所以我不需要再次声明它。最喜欢的名字是诀窍! – 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")]