2009-06-22 12 views
6

Digamos que tengo un NSArray de NSDictionaries que tiene 10 elementos. Quiero crear un segundo NSArray con los valores de una sola clave en cada diccionario. La mejor manera que puedo imaginar para hacer esto es:¿Cuál es la convención estándar para crear un nuevo NSArray de un NSArray existente?

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

Pero en teoría, debería ser capaz de salirse con no usar una matriz mutable y utilizando un contador en conjunción con [nameArray addObjectAtIndex:count], porque la nueva lista debe ser exactamente tan largo como la lista anterior. Tenga en cuenta que NO estoy tratando de filtrar un subconjunto de la matriz original, sino que hago una nueva matriz con exactamente el mismo número de elementos, solo con los valores extraídos del atributo arbitrario de cada elemento en la matriz.

en Python uno podría resolver este problema como este:

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

o si usted era un masoquista, así:

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

tener que ser un poco más explícito en Objective-C me hace Me pregunto si existe una forma común aceptada de manejar estas situaciones.

Respuesta

11

En este caso particular, cacao no se deja ganar en la concisión :)

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

De la documentación NSArray:

valueForKey:

Devuelve una matriz que contiene los resultados de invocando valueForKey: usando la clave en cada uno de los objetos del receptor.

+1

Eso es genial, gracias! – Prairiedogg