2010-11-17 11 views
7

OK, c'est un peu obscur, mais ça me donne mal à la tête.Extraire des chaînes d'un tableau d'objets NSArray, basé sur un tableau de NSStrings

Si vous avez un tableau de chaînes

{@"1", @"2", @"4"} 

Et vous avez un tableau d'objets recette

{ {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"} 
} 

Comment puis-je, en utilisant le premier tableau, créez un tableau comme celui-ci:

{@"Lasagna", @"Burger", @"Roast Chicken"} 

En d'autres termes, il prend les nombres dans le premier tableau et crée un tableau de recipe_nam es où le recette_id correspond aux chiffres ...

Répondre

5

Votre tableau d'objets recette est essentiellement un dictionnaire:

NSDictionary *recipeDict = 
    [NSDictionary dictionaryWithObjects:[recipes valueForKey:@"recipe_name"] 
           forKeys:[recipes valueForKey:@"recipe_id"]]; 

Et sur un dictionnaire, vous pouvez utiliser la valeur clé Méthode de codage:

NSArray *result = [[recipeDict dictionaryWithValuesForKeys:recipeIDs] allValues]; 
2

en supposant que vos vous pouvez utiliser un prédicat comme compatible Recipe objets sont-valeur de clé (dont ils sont presque toujours) si:

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"]; 
12

Utilisez un NSPredicate pour spécifier le type d'objets que vous souhaitez, puis utilisez -[NSArray filteredArrayUsingPredicate:] pour sélectionner précisément les objets:

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 utilise son propre mini-langue pour construire un prédicat d'un format. La grammaire de format est documenté dans le "Predicate Programming Guide."

Si vous ciblez iOS 4.0+, une alternative plus flexible est d'utiliser -[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]; 
+0

explication de Nice !! –