我正在尝试过滤出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);
答案 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”。