Split array of dictionaries into sub-arrays

957 Views Asked by At

Below is a part of my JSON response where 'results' is an array of dictionaries :

{
  "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"
    }
  ]
}

Now I have another JSON response where 'genres' is an array which contains objects which are subset of 'results' array objects with key 'id'.

{
  "genres": [
    3,
    1
  ]
}

Now, is it possible for me to split 'results' into two arrays 'results1' and 'results2' like:

{
  "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"
    }
  ]
}

and

{
  "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"
    }
  ]
}
6

There are 6 best solutions below

2
Nirav D On BEST ANSWER

For that you need to use NSPredicate with IN and NOT like this way.

First create resultArray and genresArray from your two JSON responses.

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

Now filter your resultArray using NSPredicate to get your result.

For Result1

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

For Result2

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

Do like following way:

    NSMutableArray * genresArray = [NSMutableArray new];

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

Try This One For Above Scenario:

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
Dhaval Dobariya On

Yes, you can do that using NSPredicate, but for that you first have to store all your dictionary objects into one NSArray or NSMutableArray whatever suits to your requirement.

0
Kamal Thakur On

Do like:

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

one way to do in Swift - 3 using filter and map

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])