9

I am facing a very regular scenario.

I have an NSArray which has object of a custom type, say Person. The Person class has the attributes: firstName, lastName and age.

How can I get an NSArray containing only one attribute from the NSArray having Person objects?

Something like:

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

I have a solution of writing a for loop and fill in the firstNames array but I don't want to do that.

Arslan Ali
  • 17,418
  • 8
  • 58
  • 76
Haseeb Khan
  • 795
  • 2
  • 11
  • 22

3 Answers3

22

NSArray will handle this for you using KVC

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

This will give you an array of the firstName values from each entry in the array

Joshua Weinberg
  • 28,598
  • 2
  • 97
  • 90
1

Check out the filterUsingPredicate: method in NSMutableArray, basically you create a NSPredicate object that will define how the array will be filtered.

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

This guide will give you an overview, and has a section for dealing with arrays.

avizzini
  • 789
  • 1
  • 7
  • 17
1

You can also use block based enumeration:

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

The benefit is it is fast and efficient if you have a bunch of people...

dawg
  • 98,345
  • 23
  • 131
  • 206