好的,这有点模糊,但它让我头疼。
如果你有一个字符串数组
{@"1", @"2", @"4"}
你有一个食谱对象数组
{ {recipe_name:@"Lasagna", recipe_id:@"1"}
{recipe_name:@"Burger", recipe_id:@"2"}
{recipe_name:@"Pasta", recipe_id:@"3"}
{recipe_name:@"Roast Chicken", recipe_id:@"4"}
{recipe_name:@"Sauerkraut", recipe_id:@"5"}
}
我如何使用第一个数组创建一个这样的数组:
{@"Lasagna", @"Burger", @"Roast Chicken"}
用它来说,它是取第一个数组中的数字并创建一个recipe_names数组,其中recipe_id与数字相匹配......
答案 0 :(得分:12)
使用NSPredicate
指定所需的对象类型,然后使用-[NSArray filteredArrayUsingPredicate:]
精确选择这些对象:
NSArray *recipeArray = /* array of recipe objects keyed by "recipe_id" strings */;
NSArray *keyArray = /* array of string "recipe_id" keys */;
NSPredicate *pred = [NSPredicate predicateWithFormat:@"recipe_id IN %@", keyArray];
NSArray *results = [recipeArray filteredArrayUsingPredicate:pred];
NSPredicate
使用自己的迷你语言从格式构建谓词。格式语法记录在"Predicate Programming Guide."
如果您的目标是iOS 4.0+,则更灵活的选择是使用-[NSArray indexesOfObjectsPassingTest:]
:
NSIndexSet *indexes = [recipeArray indexesOfObjectsPassingTest:
^BOOL (id el, NSUInteger i, BOOL *stop) {
NSString *recipeID = [(Recipe *)el recipe_id];
return [keyArray containsObject:recipeID];
}];
NSArray *results = [recipeArray objectsAtIndexes:indexes];
答案 1 :(得分:5)
您的配方对象数组基本上是字典:
NSDictionary *recipeDict =
[NSDictionary dictionaryWithObjects:[recipes valueForKey:@"recipe_name"]
forKeys:[recipes valueForKey:@"recipe_id"]];
在字典上,您可以使用键值编码方法:
NSArray *result = [[recipeDict dictionaryWithValuesForKeys:recipeIDs] allValues];
答案 2 :(得分:2)
假设你的Recipe
对象符合键值(它们几乎总是如此),你可以使用这样的谓词:
NSArray *recipes= // array of Recipe objects
NSArray *recipeIDs=[NSArray arrayWithObjects:@"1",@"2",@"3",nil];
NSPredicate *pred=[NSPredicate predicateWithFormat:@"recipe_id IN %@", recipeIDs];
NSArray *filterdRecipes=[recipes filteredArrayUsingPredicate:pred];
NSArray *recipeNames=[filterdRecipes valueForKey:@"recipe_name"];