如何根据元素内部的值将nsdictionary数组分组

我有一个字典数组需要根据作为元素的一部分的PO进行分组,并且也根据相同的PO得到quantityOrdered的总和。 采购订单是dynamic的,这意味着它可以是需要过滤的任何值,并相应地计算出数量。

请帮忙。

{ PO = PO2; QuantityReceived = 1; }, { PO = PO1; QuantityReceived = 3; }, { PO = PO1; QuantityReceived = 3; }, { PO = PO3; QuantityReceived = 2; }, { PO = PO2; QuantityReceived = 2; }, { PO = PO3; QuantityReceived = 4; }, { PO = PO1; QuantityReceived = 1; }, 

道歉的困惑或不完整的问题,但我需要创build一个类似这样的新的字典数组:

 { PO = PO1; TotalQuanityReceived=7; LineItems=3; }, { PO = PO2; TotalQuanityReceived=3; LineItems=2; }, { PO = PO3; TotalQuanityReceived=6; LineItems=2; }, 

我更新了我的例子,使其易于阅读。

 - (NSArray *)whatever:(NSArray *)dictionaries { NSMutableArray *results = [[NSMutableArray alloc] init]; NSMutableDictionary *resultsByPO = [[NSMutableDictionary alloc] init]; for (NSDictionary *dictionary in dictionaries) { id po = [dictionary objectForKey:@"PO"]; NSMutableDictionary *result = [resultsByPO objectForKey:po]; if (result == nil) { result = [[NSMutableDictionary alloc] init]; [resultsByPO setObject:result forKey:po]; [results addObject:result]; [result setObject:po forKey:@"PO"]; } double total = [[result objectForKey:@"TotalQuantityReceived"] doubleValue]; total += [[dictionary objectForKey:@"QuantityOrdered"] doubleValue]; int count = 1 + [[result objectForKey:@"Count"] intValue]; [result setObject:@(total) forKey:@"TotalQuantityReceived"]; [result setObject:@(count) forKey:@"Count"]; } return results; } 

PO值不符合NSCopying会带来更多的痛苦。

你可以用KVC或愚蠢的简单方法来做到这一点。 让我们这样做愚蠢的简单的方法!

制作一个空的NSMutableDictionary。 我们称之为dict

循环访问您的字典数组。 对于每个字典:

  1. 取其PO。 称这个值为thisPO

  2. dict[thisPO] 。 是零吗?

    一个。 是。 好的,所以这个PO还没有遇到。 将dict[thisPO]设置为收到的字典数量(作为NSNumber)。

    湾 否。将该值转换为一个整数,添加收到的字典数量,并将总数设置为dict[thisPO] (作为NSNumber)。

完成! 结果不是你所要求的; 结果如下所示:

 { PO1 = 100; PO2 = 120; ... } 

但是现在你明白了,总计的工作已经完成了,如果这是你想要的,很容易把它转换成一系列字典。

不是100%确定,如果这是你所说的或不是,而是根据其中一个元素来sorting字典数组,它将看起来像这样。

 NSDictionary *d1 = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithDouble:100],@"PO", [NSNumber numberWithDouble:0], @"Category", nil]; NSDictionary *d2 = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithDouble:50],@"PO", [NSNumber numberWithDouble:90], @"Category", nil]; NSArray *unsorted = @[d1, d2]; NSArray *sortedArray; sortedArray = [unsorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { NSDictionary *first = (NSDictionary*)a; NSDictionary *second = (NSDictionary*)b; NSNumber *firstPO = [first objectForKey:@"PO"]; NSNumber *secondPO = [second objectForKey:@"PO"]; return [firstPO compare:secondPO]; }]; NSLog(@"unsorted = %@", unsorted); NSLog(@"sorted = %@", sortedArray); 

我不太确定PO是什么,所以我只是以NSNumber为例。 查看此页面,了解如何比较客户对象。 http://nshipster.com/nssortdescriptor/

然后,您可以循环访问数组,现在按照正确的顺序构build下一个NSDictionary。