2009-06-22 8 views
6

Disons que j'ai un NSArray de NSDictionaries qui est long de 10 éléments. Je veux créer un deuxième NSArray avec les valeurs pour une seule clé sur chaque dictionnaire. La meilleure façon que je peux comprendre pour ce faire est:Quelle est la convention standard pour créer un nouveau NSArray à partir d'un NSArray existant?

NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:[array count]]; 
    for (NSDictionary *p in array) { 
     [nameArray addObject:[p objectForKey:@"name"]]; 
    } 
    self.my_new_array = array; 
    [array release]; 
    [nameArray release]; 
} 

Mais en théorie, je devrais pouvoir sortir sans l'aide d'un tableau mutable et en utilisant un compteur conjointement avec [nameArray addObjectAtIndex:count], parce que devrait être la nouvelle liste exactement aussi longtemps que l'ancienne liste. Veuillez noter que je n'essaie PAS de filtrer pour un sous-ensemble du tableau original, mais de créer un nouveau tableau avec exactement le même nombre d'éléments, juste avec des valeurs extraites de l'attribut arbitraire de chaque élément du tableau.

En python on pourrait résoudre ce problème comme celui-ci:

new_list = [p['name'] for p in old_list] 

ou si vous étiez un masochiste, comme ceci:

new_list = map(lambda p: p['name'], old_list) 

avoir à être un peu plus explicite en c objective me fait Je me demande s'il existe une façon commune acceptée de gérer ces situations.

Répondre

11

Dans ce cas particulier Cocoa est pas en reste dans succinctness :)

NSArray *newArray = [array valueForKey:@"name"]; 

De la documentation NSArray:

valueForKey:

Renvoie un tableau contenant les résultats de invocation de valueForKey: utilisation de la clé sur chacun des objets du destinataire.

+1

Voilà, merci! – Prairiedogg

Questions connexes