根据NSDictionary中的键对NSDictionary的NSArray进行分组

时间:2014-01-04 19:16:22

标签: ios objective-c cocoa-touch nsarray nsdictionary

我正在尝试过滤出NSArray的NSArray。以下我的例子,我想要dict1,dict2& dict4分组在一个数组中,dict3& dict5分组在第二个数组中,dict6分组在第三个数组中。

我在NSArray中获取这些数据,所以基本上下面的“orig”数组是我的输入,我知道我需要根据“Name”键进行分组。

而不是循环遍历NSArray我使用valueForKeyPath来返回基于键路径的数组,但这不起作用(与日志崩溃 - [NSMutableArray addObjectsFromArray:]:数组参数不是NSArray')。

任何建议。

NSDictionary *dict1 = @{@"Name" : @"T1", @"Age" : @"25"};
NSDictionary *dict2 = @{@"Name" : @"T1", @"Age" : @"25"};
NSDictionary *dict3 = @{@"Name" : @"T2", @"Age" : @"27"};
NSDictionary *dict4 = @{@"Name" : @"T1", @"Age" : @"25"};
NSDictionary *dict5 = @{@"Name" : @"T2", @"Age" : @"27"};
NSDictionary *dict6 = @{@"Name" : @"T3", @"Age" : @"28"};

NSArray *orig = @[dict1, dict2, dict3, dict4, dict5, dict6];

NSMutableArray *final = [NSMutableArray array];

final = [orig valueForKeyPath:@"@unionOfArrays.Name"];

NSLog(@"Final = %@", final);

2 个答案:

答案 0 :(得分:5)

有点难以判断你想要的是三个不同的数组,其中每个数组只包含具有特定Name值的条目(如第一段建议的那样),或者如果你想要一个单独的数组,其中条目是按Name排序(如第二段所示)。无论如何,

orig字段的值对Name进行排序:

NSArray *sortedByName = [orig sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"Name" ascending:YES]]];

通过仅选择具有Name特定值的条目来获取新数组:

NSArray *t1Only = [orig filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"Name = %@", @"T1"]];

答案 1 :(得分:4)

如果所需的输出是一个数组数组,你可以通过在原语中构建一个由name属性键入的字典来实现:

- (NSArray *)collateByName:(NSArray *)original {

    NSMutableDictionary *collate  = [NSMutableDictionary dictionary];
    for (NSDictionary *d in original) {
        NSString *newKey = d[@"Name"];
        NSMutableArray *newValue = collate[newKey];
        if (!newValue) {
            newValue = [NSMutableArray array];
            collate[newKey] = newValue;
        }
        [newValue addObject:d];
    }
    return [collate allValues];
}

我认为这有点冗长,但很清楚。如果要通过编程方式确定要区分的属性,请传入另一个名为attribute的参数,并用它替换文字@“Name”。