0

入れ子とは、キーと値のペアの配列を取得し、指定されたキーでそれらを階層的にグループ化することを意味します。例については、http: //bl.ocks.org/d/3176159/のページを参照してください。そうでない場合は、 https://github.com/mbostock/d3/blob/master/src/core/nest.jsを移植しようとしますが、車輪の再発明はしたくありません。

4

1 に答える 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 に答える