Split array of dictionaries into sub-arrays

904 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
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
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])
0
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
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
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
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];