Ios 基于NSDictionary中的密钥对NSDictionary的NSArray进行分组

Ios 基于NSDictionary中的密钥对NSDictionary的NSArray进行分组,ios,objective-c,cocoa-touch,nsarray,nsdictionary,Ios,Objective C,Cocoa Touch,Nsarray,Nsdictionary,我正试图过滤掉一大堆词典。在下面的示例中,我希望将dict1、dict2和dict4分组在一个数组中,dict3和dict5分组在第二个数组中,dict6分组在第三个数组中 我在NSArray中获取这些数据,因此下面的“orig”数组本质上是我的输入,我知道我需要根据“Name”键进行分组 而不是循环通过NSArray I,而是使用valueForKeyPath基于密钥路径返回我数组,但这不起作用(与日志崩溃-[NSMutableArray addObjectsFromArray::]:数组参数

我正试图过滤掉一大堆词典。在下面的示例中,我希望将dict1、dict2和dict4分组在一个数组中,dict3和dict5分组在第二个数组中,dict6分组在第三个数组中

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

而不是循环通过NSArray I,而是使用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);

很难判断您想要的是三个不同的数组,其中每个数组只包含具有特定
名称
值的条目(如第一段所示),还是想要一个单个数组,其中条目按
名称
排序(如第二段所示)。不管怎样

要根据
名称
字段的值对源代码进行排序,请执行以下操作:

NSArray *sortedByName = [orig sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"Name" ascending:YES]]];
要通过仅选择具有特定值的
Name
项来获取新数组,请执行以下操作:

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

如果所需的输出是数组数组,则可以通过在orig dictionaries中构建由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”。

非常感谢您的回答。我不想对现有数组进行排序。我希望不同的数组只包含特定的数据。在第二种方法中,我需要知道要输入谓词的值,而我不知道。我只是想得到具有唯一键值的不同数组。谢谢!事实上,我在找没有for循环的东西。我相信这应该是可行的!向上投票!很高兴这有点帮助。需求本质上是迭代的。另一种方法可能会隐藏循环,但循环将在解决方案中的某个地方,可能(我也同意最好)隐藏在SDK方法中!