Сортировка основного массива NSArray по паре значений ключа SubArray

Я хочу отсортировать свой основной массив в зависимости от first_name в массиве self.contacts

Код, используемый для сортировки массива

-(void)Sort
{
     NSSortDescriptor *sdName = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES];
     self.contacts = [NSMutableArray arrayWithArray:[self.contacts sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sdName, nil]]];
}

Мои данные

self.contacts = (
        {
            contact = {
                "first_name" = "Test R";
            };

            "last_met" = (
                {
                    "last_met_date" = "2014-10-09";
                }
            );
        },
        {
            contact = {
                "first_name" = "Test K";
            };

            "last_met" = (
                {
                    "last_met_date" = "2014-10-09";

                }
            );
        }
    )

person user2794321    schedule 10.10.2014    source источник
comment
Пожалуйста, добавьте дополнительную информацию. Ваш вопрос очень расплывчатый.   -  person TMob    schedule 10.10.2014


Ответы (2)


Попробуйте использовать этот дескриптор сортировки:

descriptor = [[NSSortDescriptor alloc] initWithKey:@"contact.first_name" 
                                         ascending:YES];

Параметр key на самом деле является ключевым путем, а NSDictionary соответствует требованиям KV. Вы можете написать что-нибудь вроде: [contacts[0] valueForKeyPath:@"contact.first_name"].

person djromero    schedule 10.10.2014

Глядя на ваш код, похоже, что вы хотите отсортировать свой массив контактов, который представляет собой массив словарей, решение, которое я предлагаю здесь, предназначено для этого случая.

Сделать это можно так:

NSArray *sortedContactsArray = [self.contacts sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *first_name1 = [obj1 valueForKeyPath:@"contact.first_name"];
    NSString *first_name2 = [obj2 valueForKeyPath:@"contact.first_name"];

    return [first_name1 compare:first_name2];
}];

Обратите внимание, что это может быть небезопасно и не оптимально, но это лишь один из способов сделать это.

person MANIAK_dobrii    schedule 10.10.2014