入れ子とは、キーと値のペアの配列を取得し、指定されたキーでそれらを階層的にグループ化することを意味します。例については、http: //bl.ocks.org/d/3176159/のページを参照してください。そうでない場合は、 https://github.com/mbostock/d3/blob/master/src/core/nest.jsを移植しようとしますが、車輪の再発明はしたくありません。
質問する
350 次
1 に答える
0
これが私が思いついた答えです。改善案があれば教えてください。
// Wrapper method
// keys are in order of hierarchy
- (NSMutableArray *)nestArray:(NSArray *)array withKeys:(NSArray *)keys
{
return [self nestArray:array withKeys:keys depth:0];
}
// Private
// Assumes arrays of dictionaries with strings as the entries.
- (NSMutableArray *)nestArray:(NSArray *)array withKeys:(NSArray *)keys depth:(int)depth
{
// Current key
NSString *key = [keys objectAtIndex:depth];
depth++;
// Create dictionary of the keys
NSMutableDictionary *map = [[NSMutableDictionary alloc] init];
for (NSDictionary *dictionary in array) {
NSString *value = [dictionary objectForKey:key];
if ([map objectForKey:value]) {
[[map objectForKey:value] addObject:dictionary];
} else {
[map setObject:[NSMutableArray arrayWithObject:dictionary] forKey:value];
}
}
NSMutableArray *nest = [[NSMutableArray alloc] init];
for (NSString *valkey in [map allKeys]) {
NSMutableArray *values = [map objectForKey:valkey];
if (depth < keys.count) {
values = [self nestArray:[NSArray arrayWithArray:array] withKeys:keys depth:depth];
}
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:valkey,@"key",values,@"values", nil];
[nest addObject:dictionary];
}
return nest;
}
于 2013-02-14T18:55:50.437 に答える