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,我曾尝试获取另一个键值,正如您上面所说的。但请简要解释。