递归删除字典数组中的键和值

时间:2013-08-28 06:17:00

标签: ios recursion

我有一个plist文件,其中包含字典数组enter image description here

如何遍历此操作并使用键fQty删除所有键和值?我需要删除fQty,以便我可以将字典与新字典进行比较,而不考虑fQty字段。

2 个答案:

答案 0 :(得分:0)

试试这个:

(假设您的pilst文件名为:data.plist)

- (void) deal:(id)item
{
    if ([item isKindOfClass:[NSDictionary class]]) {
        for (id key in item) {
            id it = [item objectForKey:key];
            if ([it isKindOfClass:[NSDictionary class]] || [it isKindOfClass:[NSArray class]]) {
                [self deal:it];
            }
        }
        if ([item objectForKey:@"fQty"]!=nil) {
            [item setObject:@"0" forKey:@"fQty"];
        }
    }
    if ([item isKindOfClass:[NSArray class]]) {
        for (id it in item) {
            if ([it isKindOfClass:[NSDictionary class]] || [it isKindOfClass:[NSArray class]]) {
                [self deal:it];
            }
        }
    }
}

{
    NSError** error = nil;
    NSPropertyListFormat format;
    NSArray *dma = (NSMutableArray *)[NSPropertyListSerialization
                                             propertyListWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"XD" ofType:@"plist"]]
                                            options:NSPropertyListMutableContainersAndLeaves
                                             format:&format error:error];

    [self deal:dma];
}

现在myArray就是你想要的。

编辑:你想把key @“fQty”的值设置为0,

将for循环中的行更改为[item setObject:@“0”forKey:@“fQty”],就是这样。

再次编辑: 用递归方式解决问题。

答案 1 :(得分:0)

这有点粗糙,但也许你可以使用这样的东西:

-(BOOL)isObjectAdictionary:(id)object{
    if([object isKindOfClass:[NSMutableDictionary class]]||[object isKindOfClass:[NSDictionary class]]){
    return YES;
    }
    return NO;
}

 -(BOOL)isObjectAnArray:(id)object{
      if([object isKindOfClass:[NSMutableArray class]]||[object isKindOfClass:[NSArray class]]){
         return YES;
      }
     return NO;
   }


-(id)loop:(id)object removeObjectWithKey:(NSString *)key{

if([self isObjectAdictionary:object]){
    NSMutableDictionary *mutableObject = [NSMutableDictionary dictionaryWithDictionary:object];
    if([[mutableObject allKeys]containsObject:key]){
        [mutableObject removeObjectForKey:key];
        object = mutableObject;
        return object;
    }

}

if([object respondsToSelector:@selector(count)]){


    if([self isObjectAdictionary:object]){
        NSMutableDictionary *objects_copy = [NSMutableDictionary dictionaryWithDictionary:object];
        for(NSString *objects_key in object){

            id tempObject = [object valueForKey:objects_key];
            tempObject = [self loop:tempObject removeObjectWithKey:key];
            [objects_copy setObject:tempObject forKey:objects_key];
        }
        object =(id)objects_copy;
    }
    else if([self isObjectAnArray:object]){//an array
        NSMutableArray *objects_copy = [NSMutableArray arrayWithArray:object];
        for(int i = 0;i<[object count];i++){
            id tempObject = [object objectAtIndex:i];
           tempObject = [self loop:tempObject removeObjectWithKey:key];
            [objects_copy replaceObjectAtIndex:i withObject:tempObject];
        }
        object = (id)objects_copy;
    }

}
 return object;
}

您可以这样使用:[self loop:yourArray removeObjectWithKey:@"fQty"]);