2014-04-03 142 views
1

NSDictionaryNSArray一個對象:NSDictionaries的NSArray的 - 合併具有相同的鍵值對字典

[ 
{ 
    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 
    } 
] 

有人能指點我正確的方向嗎?

回答

4

我不知道有什麼方法比基本蠻力做到這一點其他:

-(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; 
} 
+0

感謝@大衛,我已經編輯我的問題。我試圖還包括其他鍵值,例如在preidcate的塊中添加[evaluateObject valueForKey:@「title」],但我獲得像'{id = 1,combinedDates = 2014-04-03,2014- 04-05,2014-04-03,2014-04-04;標題=標題1,標題1; }'我確定我錯過了一些明顯的東西 – laucel

+1

VakueForKeyPath返回一個包含所有值的數組。從中創建一個集合以消除重複,類似於for循環。 –

+0

@David,我試着按照上面的說法獲得另一個關鍵值。但請簡單解釋一下。 – Parthpatel1105

1
// Group By id 
-(NSMutableDictionary*)combinedArray:(NSArray*)array 
{ 
    NSMutableArray *categories = [[NSMutableArray alloc] init]; 
    for (NSDictionary *data in array) { 

     NSString *category = [data valueForKey:@"id"]; 
     if (![categories containsObject:category]) { 
      [categories addObject:category]; 
     } 
    } 

    NSMutableDictionary *categoryData = [[NSMutableDictionary alloc]init]; 

    for (NSString *strCat in categories) { 

     NSMutableArray *catArray = [[NSMutableArray alloc]init]; 

     for (NSDictionary *data in array) { 

      NSString *category = [data valueForKey:@"id"]; 

      if ([category isEqualToString:strCat]) { 
       [catArray addObject:data]; 
      } 
     } 

     [categoryData setObject:catArray forKey:strCat]; 

    } 

    return categoryData; 
} 
相關問題