代码之家  ›  专栏  ›  技术社区  ›  Pangu

给定JSON对象的NSArray,如何在NSDictionary中为同一个键存储多个值?

  •  5
  • Pangu  · 技术社区  · 10 年前

    我知道不可能为同一个键设置多个值,除非这些值存储在数组中。

    我有一个NSArray friMainDicArray JSON对象的:

    {
            day = 0;
            "end_time" = "17:30";
            "english_event" = "Lion Dance";
            "english_performer" = "Legendary Group";
            "image_link" = "schedule_miss_vn";
            stage = 0;
            "start_time" = "17:00";
            "viet_event" = "<null>";
            "viet_performer" = "Nh?m Legendary";
        },
            {
            day = 0;
            "end_time" = "18:00";
            "english_event" = Singing;
            "english_performer" = "Ivan Cheong";
            "image_link" = "schedule_miss_vn";
            stage = 0;
            "start_time" = "17:30";
            "viet_event" = "Ca Nh?c";
            "viet_performer" = "Ivan Cheong";
        },
            {
            day = 0;
            "end_time" = "22:00";
            "english_event" = Singing;
            "english_performer" = "Between California and Summer";
            "image_link" = "";
            stage = 0;
            "start_time" = "21:00";
            "viet_event" = "Ca Nh?c";
            "viet_performer" = "";
        },
            {
            day = 0;
            "end_time" = "";
            "english_event" = "End of Day";
            "english_performer" = "";
            "image_link" = "";
            stage = 0;
            "start_time" = "22:00";
            "viet_event" = "";
            "viet_performer" = "";
        },
            {
            day = 0;
            "end_time" = "21:00";
            "english_event" = Music;
            "english_performer" = "DJ Happee From Channel 93.3";
            "image_link" = "";
            stage = 0;
            "start_time" = "20:00";
            "viet_event" = "";
            "viet_performer" = "";
        },
            {
            day = 0;
            "end_time" = "21:00";
            "english_event" = Music;
            "english_performer" = "Adam Cease";
            "image_link" = "";
            stage = 0;
            "start_time" = "20:00";
            "viet_event" = "";
            "viet_performer" = "";
        },
            {
            day = 0;
            "end_time" = "21:00";
            "english_event" = "Ao Dai Fashion Show";
            "english_performer" = "";
            "image_link" = "";
            stage = 0;
            "start_time" = "20:00";
            "viet_event" = "";
            "viet_performer" = "";
        }
    }
    

    我存储每个JSON对象 start_time 键值,但问题是 20:00 钥匙我想存储 20:00 并且JSON对象作为值。问题是,最后3个JSON对象包含相同的 20:00 键,所以我想将这3个JSON对象存储为NSArray,并将其设置为 20:00 钥匙

    我希望实现以下目标:

    for (int i = 0; i < [friMainDicArray count]; i++)
    {
        [friMainDic setValue:friMainDicArray[i] forKey:[friMainDicArray[i] valueForKey:@"start_time" ] ]
    }
    

    然而,我不知道检查是否 开始时间(_T) 键是相同的,然后将其值添加到相同的键。

    有人能指点我正确的方向吗?

    3 回复  |  直到 10 年前
        1
  •  3
  •   gabbler    10 年前

    我认为您可以循环数组,在setValueForKey之前,检查该键是否已经存在,如果是,如果该键的值是NSDictionary类型,则将当前值与现有值组合为数组,否则该键的应为NSArray,然后将当前项添加到该数组。

    for (NSDictionary *item in friMainDicArray)
    {
        NSString *key = [item valueForKey:@"start_time"];
        if ([friMainDic objectForKey:key]) {
            id value = [friMainDic objectForKey:key];
            if ([value isKindOfClass:[NSArray class]]) {
                NSMutableArray *array = [NSMutableArray arrayWithArray:(NSArray*)value];
                [array addObject:item];
                [friMainDic setValue:array forKey:key];
            } else {
                NSDictionary *dict = (NSDictionary*)value;
                NSArray *array = @[dict,item];
                [friMainDic setValue:array forKey:key];
            }
        } else {
            [friMainDic setValue:item forKey:key];
        }
    }
    
        2
  •  3
  •   Skyler Lauren    10 年前

    我想我会这样做。查找是否已经存在数组。创建一个可变版本并添加到其中。将其重新设置到字典中。如果没有,创建一个数组并添加到其中。

    for (int i = 0; i < [friMainDicArray count]; i++)
    {
        if (firMainDic[[friMainDicArray[i] valueForKey:@"start_time" ])
        {
            //pull out the array and add to it
            NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithArray: firMainDic[[friMainDicArray[i] valueForKey:@"start_time" ]]];
            [mutableArray addObject:friMainDicArray[i]];
            [friMainDic setValue:mutableArray forKey:[friMainDicArray[i] valueForKey:@"start_time" ] ];
        }
        else
        {
            NSArray *array = @[friMainDicArray[i]];
            [friMainDic setValue:array forKey:[friMainDicArray[i] valueForKey:@"start_time" ] ]
        }
    }
    

    不是100%确定,但我相信当您将一个可变数组放入字典时,它会变成一个非可变数组。不管怎样,这至少会让你朝着正确的方向开始。

        3
  •  2
  •   Ozgur Vatansever    10 年前

    我建议你把你的 JSON 对象始终在数组中,无论是否 keys 相同或不同。通过这种方式,您至少可以避免在每次迭代时进行一些模糊的检查,例如:;

    if ([dict[key] isKindOfClass:[NSMutableArray class]]) {
        NSMutableArray *values = (NSMutableArray *)dict[key];
        [values addObject:newObject];
    }
    else {
        NSMutableArray *values = [NSMutableArray arrayWithObject:dict[key]];
        [values addObject:newObject];
    }
    

    相反,我将通过使用以下方法在数组上迭代一次来填充生成的字典:( 假设所有JSON对象现在都是NSDictionary实例 )

    NSArray *events = @[@{@"start_time": @"17:00", @"end_time": @"17:30", @"english_event": @"Lion Dance", @"english_performer": @"Legendary Group"},
                        @{@"start_time": @"17:30", @"end_time": @"18:00", @"english_event": @"Singing", @"english_performer": @"Ivan Cheong"},
                        @{@"start_time": @"20:00", @"end_time": @"21:00", @"english_event": @"Music", @"english_performer": @"Adam Cease"},
                        @{@"start_time": @"20:00", @"end_time": @"21:00", @"english_event": @"Music", @"english_performer": @"DJ Happee From Channel 93.3"},
                        @{@"start_time": @"21:00", @"end_time": @"22:00", @"english_event": @"Singing", @"english_performer": @"Between California and Summer"}];
    
    NSMutableDictionary *resultDict = [NSMutableDictionary dictionary];
    
    [events enumerateObjectsUsingBlock:^(NSDictionary *event, NSUInteger idx, BOOL *stop) {
    
        NSMutableArray *values = resultDict[event[@"start_time"]];
    
        if (values == nil) {
            values = [[NSMutableArray alloc] init];
            resultDict[event[@"start_time"]] = values;
        }
        [values addObject:event];
    }];
    

    注: 我找不到更短的方法,包括 collection operators , KVO accessors 等等,这实际上需要 0(n) 用于对字典进行分组。