3
votes

Whew... what a title. So I have a NSMutableArray that is assigned data retrieved from an API call. I don't have control of the structure of the API call response, and I would like to sort the array in it's provided format. (other solutions welcome, of course)

This is a silly example (to keep things simple), but the array I'm wanting to sort can be represented something like this:

myObjects = 
array(
  0 => object(
    name => @"Jack",
    favoriteNumbers => object(
      numbers => array(
        0 => 7,
        1 => 11,
        2 => 6
      )
    )
  ),
  1 => object(
    name => @"Jill",
    favoriteNumbers => object(
      numbers => array(
        0 => 1,
        1 => 2,
        2 => 3
      )
    )
  ),
  3 => object(
    name => @"Sally",
    favoriteNumbers => object(
      numbers => array(
        0 => 68,
        1 => 103,
        2 => 99
      )
    )
  )
)

I know I can simply sort by name with something like:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortByDurationArray = [myObjects sortedArrayUsingDescriptors:sortDescriptors]; 
// the variable "myObjects" holds the array representation from above

But how would I sort the array by each persons 1st favorite number?

The desired result would sort the array in the following order: Jill, Jack, Sally; since Jill's 1st favorite number is 1, Jack's is 7 and Sally's is 68.

1

1 Answers

2
votes

You can use NSSortDescriptor’s selector property here. If these objects are their own subclass, then create a selector—something like -compareFavoriteNumberToObject: that returns an NSComparisonResult. If the objects are just something like an NSDictionary, you can make a category on the class to do the comparison.