2017-01-04 4 views
1

Ниже приводится часть моего ответа JSON, где «results» представляет собой массив из словарей:Split массив словарей на подгруппы массивов

{ 
    "results": [ 
    { 
     "id": 6, 
     "genre_name": "Action", 
     "cover_image": "http://54.254.204.81/images/Action.png" 
    }, 
    { 
     "id": 5, 
     "genre_name": "Adventure", 
     "cover_image": "http://54.254.204.81/images/Adventure.png" 
    }, 
    { 
     "id": 4, 
     "genre_name": "Romance", 
     "cover_image": "http://54.254.204.81/images/Romance.png" 
    }, 
    { 
     "id": 3, 
     "genre_name": "Sci-Fci", 
     "cover_image": "http://54.254.204.81/images/Sci-Fi.png" 
    }, 
    { 
     "id": 1, 
     "genre_name": "Guide", 
     "cover_image": "http://54.254.204.81/images/Adventure_XHLbNfN.png" 
    }, 
    { 
     "id": 2, 
     "genre_name": "Horror", 
     "cover_image": "http://54.254.204.81/images/Phineas-and-Ferb-Christmas-Wallpaper.jpg" 
    }, 
    { 
     "id": 7, 
     "genre_name": "Emotional", 
     "cover_image": "http://54.254.204.81/images/a0fea991287cf41b6b9c4aa16196517f.jpg" 
    }, 
    { 
     "id": 8, 
     "genre_name": "abcd", 
     "cover_image": "http://54.254.204.81/images/logo_text_S0KyzUW.png" 
    } 
    ] 
} 

Теперь у меня есть еще один ответ JSON, где «genres» представляет собой массив, который содержит объекты, которые являются подмножествами объектов массива 'results' с ключом 'id'.

{ 
    "genres": [ 
    3, 
    1 
    ] 
} 

Теперь это возможно для меня, чтобы разбить 'results' в два массива 'results1' и 'results2' как:

{ 
    "results1": [ 
    { 
     "id": 6, 
     "genre_name": "Action", 
     "cover_image": "http://54.254.204.81/images/Action.png" 
    }, 
    { 
     "id": 5, 
     "genre_name": "Adventure", 
     "cover_image": "http://54.254.204.81/images/Adventure.png" 
    }, 
    { 
     "id": 4, 
     "genre_name": "Romance", 
     "cover_image": "http://54.254.204.81/images/Romance.png" 
    }, 
    { 
     "id": 2, 
     "genre_name": "Horror", 
     "cover_image": "http://54.254.204.81/images/Phineas-and-Ferb-Christmas-Wallpaper.jpg" 
    }, 
    { 
     "id": 7, 
     "genre_name": "Emotional", 
     "cover_image": "http://54.254.204.81/images/a0fea991287cf41b6b9c4aa16196517f.jpg" 
    }, 
    { 
     "id": 8, 
     "genre_name": "abcd", 
     "cover_image": "http://54.254.204.81/images/logo_text_S0KyzUW.png" 
    } 
    ] 
} 

и

{ 
    "results2": [ 
    { 
     "id": 3, 
     "genre_name": "Sci-Fci", 
     "cover_image": "http://54.254.204.81/images/Sci-Fi.png" 
    }, 
    { 
     "id": 1, 
     "genre_name": "Guide", 
     "cover_image": "http://54.254.204.81/images/Adventure_XHLbNfN.png" 
    } 
    ] 
} 
+0

вы могли бы сделать это, сравнивая объекты в обоих массивах позвольте мне поделиться вам своего рода код в массиве ждать –

+0

Выполнить петлю с основным массивом { "жанрами": [ 3, ] } Здесь ваш массив будет как: NSArray * arr = [results.objectForKey: @ "genres";] Проверьте, совпадает ли идентификатор id в одном массиве с другими объектами в другом массиве. – SNarula

+0

Что вы еще пробовали? –

ответ

2

Для этого вам нужно использовать NSPredicate с IN и NOT вот так.

Сначала создайте resultArray и genresArray из ваших двух ответов JSON.

NSArray *resultArray = [firstJSONResponse objectForKey:@"results"]; 
NSArray *genresArray = [secondJSONResponse objectForKey:@"genres"]; 

Теперь фильтровать resultArray с помощью NSPredicate, чтобы получить результат.

Для Result1

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)",genresArray]; 
NSArray *firstSplitArray = [resultArray filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",firstSplitArray); 

Для result2

predicate = [NSPredicate predicateWithFormat:@"id IN %@",genresArray]; 
NSArray *secondSplitArray = [resultArray filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",secondSplitArray); 
+0

Это дает мне сообщение об ошибке: Завершение приложения из-за неотображенного исключения «NSUnknownKeyException», причина: '[<__ NSCFNumber 0xb000000000000063> valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодом для идентификатора ключа.' –

+0

Это сработало. Спасибо, Нира! –

+0

@ VamshiKrishna Приветственный помощник :) –

2

Полюбите следующим образом:

NSMutableArray * genresArray = [NSMutableArray new]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)", genresArray]; 
    NSArray *filterArray = [Yourarray filteredArrayUsingPredicate:predicate]; 
    NSLog(@"filter: %@",filterArray); 
1

Try This One For вышеприведенный сценарий:

NSDictionary *yourJson; 
NSMutableArray *array1 = [[yourJson valueForKey:@"results"] mutableCopy]; 
NSMutableArray *array2 = [[yourJson valueForKey:@"results2"] mutableCopy]; 

for(int i =0 ; i<array2.count ; i++) 
{ 
    NSString *objectFromarray2 = [array2 objectAtIndex:i]; 
    for(int j =0 ; j<array1.count ; j++) 
    { 
     NSDictionary *objectFromarray1 = [array2 objectAtIndex:i]; 
     if([[objectFromarray1 valueForKey:@"id"] isEqualToString:objectFromarray2]) 
     { 
      [array2 removeObjectAtIndex:i]; 
      [array2 insertObject:objectFromarray1 atIndex:i]; 
      [array1 removeObject:objectFromarray1]; 
     } 

    } 

} 
0

Да, вы можете сделать это с помощью NSPredicate, но для этого сначала нужно хранить все объекты словаря в один NSArray или NSMutableArray, что подходит вашему требованию.

0

ли как:

NSString *search1 = @"3"; 
NSString *search2 = @"1"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY SELF == %@) OR (ANY SELF == %@)", search1,search2]; 
NSArray *filtered = [Yourarray filteredArrayUsingPredicate:predicate]; 
0

один способ сделать в Swift - 3, используя фильтр и карту

let resultArray = results["results"]! 

let genArray = genres["genres"]! 

var result1Array : [[String:Any]] = resultArray 
var result2Array : [[String:Any]] = [] 

for gen in genArray { 

    if let elm = resultArray.filter({ $0["id"] as! Int == gen }).first { 
     result2Array.append(elm) 
     result1Array = result1Array.filter({ $0["id"] as! Int != elm["id"] as! Int }) 
    } 

} 

print(["result2":result2Array]) 
print("\n") 
print(["result1":result1Array])