2009-06-22 18 views
6

Diciamo che ho uno NSArray di NSDictionaries lungo 10 elementi. Voglio creare un secondo NSArray con i valori per una singola chiave su ciascun dizionario. Il modo migliore che posso capire per fare questo è:Qual è la convenzione standard per la creazione di un nuovo NSArray da un NSArray esistente?

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]; 
} 

Ma in teoria, dovrei essere in grado di farla franca, non utilizzando una matrice mutevole e utilizzando un contatore in combinazione con [nameArray addObjectAtIndex:count], perché la nuova lista dovrebbe essere esattamente come la vecchia lista. Si noti che NON sto provando a filtrare per un sottoinsieme dell'array originale, ma creare un nuovo array con esattamente lo stesso numero di elementi, solo con i valori estratti dall'attributo arbitrario di ciascun elemento dell'array.

in Python si potrebbe risolvere il problema in questo modo:

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

o se tu fossi un masochista, come questo:

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

Dovendo essere un po 'più esplicito in Objective-C mi fa mi chiedo se c'è un modo comune accettato di gestire queste situazioni.

risposta

11

In questo caso particolare, cacao non è da meno in succinctness :)

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

Dalla documentazione NSArray:

valueForKey:

restituisce una matrice contenente i risultati di invocare valueForKey: utilizzando la chiave su ciascuno degli oggetti del destinatario.

+1

Ecco, grazie! – Prairiedogg

Problemi correlati