Ios NSDictionary数组-具有相同键值对的合并字典
我有一个Ios NSDictionary数组-具有相同键值对的合并字典,ios,merge,nsarray,nsdictionary,Ios,Merge,Nsarray,Nsdictionary,我有一个NSArray的NSDictionary对象: [ { id = 1; fromDate = 2014-04-03; toDate = 2014-04-05; date = 0000-00-00; title = title 1 }, { id = 1; fromDate = 0000-00-00; toDate = 0000-00-00; date = 2014-04-03 title = title
NSArray
的NSDictionary
对象:
[
{
id = 1;
fromDate = 2014-04-03;
toDate = 2014-04-05;
date = 0000-00-00;
title = title 1
},
{
id = 1;
fromDate = 0000-00-00;
toDate = 0000-00-00;
date = 2014-04-03
title = title 1
},
{
id = 1;
fromDate = 0000-00-00;
toDate = 0000-00-00;
date = 2014-04-04;
title = title 1
},
{
id = 2;
fromDate = 0000-00-00;
toDate = 0000-00-00;
date = 2014-05-10;
title = title 2
},
{
id = 2;
fromDate = 0000-00-00;
toDate = 0000-00-00;
date = 2014-05-11;
title = title 2
}
]
我想将具有相同id值的字典合并到一个字典中,将所有日期、fromDate和toDate键组合在一起,获得这样一个忽略零值的数组:
[
{
id = 1,
combinedDates = 2014-04-03, 2014-04-05, 2014-04-03, 2014-04-04;
title = title 1
},
{
id = 2,
combinedDates = 2014-05-10, 2014-05-11;
title = title 2
}
]
有人能给我指出正确的方向吗?除了基本的暴力之外,我不知道有什么方法可以做到这一点:
-(NSArray*)combinedArray:(NSArray*)array
{
NSMutableArray* combined = [NSMutableArray new];
// Iterate over each unique id value
for(id key in [NSSet setWithArray:[array valueForKeyPath:@"id"]])
{
// skip missing keys
if([key isKindOfClass:[NSNull class]])
continue;
// Sub array with only id = key
NSArray* filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSDictionary* evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject valueForKey:@"date"] && [[evaluatedObject valueForKey:@"id"] isEqual:key];
}]];
// Grab the dates
NSArray* dates = [filtered valueForKeyPath:@"date"];
// add the new dictionary
[combined addObject:@{ @"id":key, @"combinedDates":dates }];
}
return array;
}
除了基本的暴力,我不知道有什么方法可以做到这一点:
-(NSArray*)combinedArray:(NSArray*)array
{
NSMutableArray* combined = [NSMutableArray new];
// Iterate over each unique id value
for(id key in [NSSet setWithArray:[array valueForKeyPath:@"id"]])
{
// skip missing keys
if([key isKindOfClass:[NSNull class]])
continue;
// Sub array with only id = key
NSArray* filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSDictionary* evaluatedObject, NSDictionary *bindings) {
return [evaluatedObject valueForKey:@"date"] && [[evaluatedObject valueForKey:@"id"] isEqual:key];
}]];
// Grab the dates
NSArray* dates = [filtered valueForKeyPath:@"date"];
// add the new dictionary
[combined addObject:@{ @"id":key, @"combinedDates":dates }];
}
return array;
}
谢谢@David,我已经编辑了我的问题。我还试图包括其他键值,例如在preidcate的块中添加[evaluatedObject valueForKey:@“title”],但我获得了类似`{id=1,combinedDates=2014-04-032014-04-052014-04-032014-04-04;title=title 1,title 1;}的复杂度`我肯定我遗漏了一些明显的东西VakueforkeyPath返回一个包含所有值的数组。从中创建一个集合以消除重复项,类似于for循环。@David,我已尝试获取另一个键值,正如您上面所说的。但请简要解释。谢谢@David,我已编辑了我的问题。我还试图包括其他键值,例如在preidcate的块中添加[evaluatedObject valueForKey:@“title”],但我获得了类似`{id=1,combinedDates=2014-04-032014-04-052014-04-032014-04-04;title=title 1,title 1;}的复杂度`我肯定我遗漏了一些明显的东西VakueforkeyPath返回一个包含所有值的数组。从中创建一个集合以消除重复项,类似于for循环。@David,我曾尝试获取另一个键值,正如您上面所说的。但请简要解释。