2015-08-26 4 views
1

Мне нужно объединить два словаря без повторенияСлияние двух NSDictionary без повторения

Первый, как:

{ 
    "Posts": [ 
    { 
     "id": "1", 
     "Title": "First post", 
     "Category": "News" 
    }, 
    { 
     "id": "2", 
     "Title": "Second post", 
     "Category": "News" 
    }, 
    { 
     "id": "3", 
     "Title": "Third post", 
     "Category": "News" 
    } 
    ] 
} 

И второе, как:

{ 
    "Posts": [ 
    { 
     "id": "3", 
     "Title": "Third post", 
     "Category": "News" 
    }, 
     { 
     "id": "4", 
     "Title": "Fourth post", 
     "Category": "News" 
    }, 
     { 
     "id": "5", 
     "Title": "Fifth post", 
     "Category": "News" 
    } 
    ] 
} 

Как я могу объединить без повторения третья запись?

Может кто-нибудь помочь

+0

Вы задаете неправильный вопрос, Ваш вопрос должен быть 'Как объединить два массива без повторения?'. Поскольку приведенные вами примеры являются словарями массива, и вы хотите, чтобы оба массива вместе. –

ответ

2
NSDictionary *dic1 = @{ 
      @"Posts" : @[ 
        @{ 
          @"id" : @"1", @"Title" : @"First post", @"Category" : @"News" 
        }, @{ 
          @"id" : @"2", @"Title" : @"Second post", @"Category" : @"News" 
        }, @{ 
          @"id" : @"3", @"Title" : @"Third post", @"Category" : @"News" 
        } 
      ] 
    }; 

    NSDictionary *dic2 = @{ 
      @"Posts" : @[ 
        @{ 
          @"id" : @"3", @"Title" : @"Third post", @"Category" : @"News" 
        }, @{ 
          @"id" : @"4", @"Title" : @"Fourth post", @"Category" : @"News" 
        }, @{ 
          @"id" : @"5", @"Title" : @"Fifth post", @"Category" : @"News" 
        } 
      ] 
    }; 

    NSMutableArray *keys = [NSMutableArray new]; 

    [dic1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 

     [keys addObject:dic1[ key ]]; 
    }]; 

    [dic2 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 

     [keys addObject:dic2[ key ]]; 
    }]; 

    NSMutableArray *totalResult = [NSMutableArray new]; 

    [keys enumerateObjectsUsingBlock:^(NSArray *obj, NSUInteger idx, BOOL *stop) { 

     [obj enumerateObjectsUsingBlock:^(id obj2, NSUInteger idx2, BOOL *stop2) { 
      NSArray *filtered = [totalResult filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(id == %@)", obj2[ @"id" ]]]; 
      if (!filtered.count) { 
       [totalResult addObject:obj2]; 
      } 
     }]; 

    }]; 

    NSLog(@""); 

enter image description here

1

Merge ключей оба словаря (две отдельных массивов извлекаются dict.allKeys), а также создать новый словарь. Но если вы получаете похожие ключи в allKeys, вам нужно создать свою собственную систему, чтобы выбрать один из двух (или более, если у вас есть более двух словарей) уважаемые значения.

NSDictionary *dict1=[NSDictionary dictionary]; 
NSDictionary *dict2=[NSDictionary dictionary]; 

NSArray *arr1=[dict1 allKeys]; 
NSArray *arr2=[dict2 allKeys]; 

NSArray *allKeysArray=[arr1 arrayByAddingObjectsFromArray:arr2]; 

NSMutableDictionary *newDict=[[NSMutableDictionary alloc]init]; 

for (NSString *aKey in allKeysArray) 
{ 
    BOOL bothArrayContainSameKey=NO; 
    if ([arr1 containsObject:aKey] && [arr2 containsObject:aKey]) 
    { 
     bothArrayContainSameKey=YES; 
     //needs special treatment 
    } 
    else if ([arr1 containsObject:aKey]) 
    { 
     [newDict setObject:dict1[aKey] forKey:aKey]; 
    } 
    else if ([arr2 containsObject:aKey]) 
    { 
     [newDict setObject:dict2[aKey] forKey:aKey]; 
    } 
} 
Смежные вопросы