Search code examples
objective-cmergensdictionary

Deep combine NSDictionaries


I need to merge two NSDictionarys into one provided that if there are dictionaries within the dictionaries, they are also merged.

More or less like jQuery's extend function.


Solution

  • NSDictionary+Merge.h

    #import <Foundation/Foundation.h>
    
    @interface NSDictionary (Merge)
    
    + (NSDictionary *) dictionaryByMerging: (NSDictionary *) dict1 with: (NSDictionary *) dict2;
    - (NSDictionary *) dictionaryByMergingWith: (NSDictionary *) dict;
    
    @end
    

    NSDictionary+Merge.m

    #import "NSDictionary+Merge.h"
    
    @implementation NSDictionary (Merge)
    
    + (NSDictionary *) dictionaryByMerging: (NSDictionary *) dict1 with: (NSDictionary *) dict2 {
        NSMutableDictionary * result = [NSMutableDictionary dictionaryWithDictionary:dict1];
    
    [dict2 enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
        if (![dict1 objectForKey:key]) {
            if ([obj isKindOfClass:[NSDictionary class]]) {
                NSDictionary * newVal = [[dict1 objectForKey: key] dictionaryByMergingWith: (NSDictionary *) obj];
                [result setObject: newVal forKey: key];
            } else {
                [result setObject: obj forKey: key];
            }
        }
    }];
    
        return (NSDictionary *) [[result mutableCopy] autorelease];
    }
    - (NSDictionary *) dictionaryByMergingWith: (NSDictionary *) dict {
        return [[self class] dictionaryByMerging: self with: dict];
    }
    
    @end