9

Me enfrento a un escenario muy común.Obtener un NSArray de un solo atributo de un NSArray

Tengo un NSArray que tiene un objeto de un tipo personalizado, digamos Persona. La clase Person tiene los atributos: firstName, lastName y age.

¿Cómo puedo obtener un NSArray que contenga solo un atributo del NSArray que tenga objetos Persona?

Algo así como:

NSArray *people; 
NSArray *firstNames = [people getArrayOfAttribute:@"firstName" andType:Person.Class] 

tengo una solución de escribir un bucle y rellenar la matriz firstNames pero no quiero hacer eso.

+0

¿Es algo similar a una matriz del diccionario – visakh7

+0

¿Por qué no quiere hacer un bucle en la matriz? – jaminguy

+0

No quiero hacer un bucle en la matriz manualmente solo para guardar las líneas de código e implementar las cosas en las que estoy trabajando de una manera elegante. –

Respuesta

22

NSArray se encargará de esto para usted, utilizando KVC

NSArray *people ...; 
NSArray *firstName = [people valueForKey:@"firstName"]; 

Esto le dará una matriz de los valores de Nombre FROM cada entrada de la matriz

1

Echa un vistazo al uso del filtroPredido: en NSMutableArray, básicamente creas un objeto NSPredicate que definirá cómo se filtrará la matriz.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-CJBDBHCB

Esta guía le dará una visión general, y tiene una sección para hacer frente a las matrices.

+0

+1: Esto es correcto, pero a menos que sea una matriz masiva, solo usar un bucle for funcionará, y sin la molestia de usar Predicados. –

+1

Su pregunta no se trata de filtrar la matriz, se trata de crear una matriz a partir de una clave de los valores en la matriz. –

1

También puede utilizar la enumeración basada en bloque:

NSArray *people; // assumably has a bunch of people 
NSMutableArray *firstNames = [NSMutableArray array]; 

[people enumerateObjectsUsingBlock: 
^(id obj, NSUInteger idx, BOOL*flag){ 
    // filter however you want... 
    [firstNames addObject:[Person firstName]]; 
}]; 

La ventaja es que es rápido y eficiente si tiene un montón de gente ...

+0

Genial. Olvidé que KVC haría esto. Gracias por recordarme. (Votado) –

Cuestiones relacionadas