如何从两个不同的数组中找到公共对象并打印另一个对象?

时间:2018-02-14 12:34:54

标签: ios objective-c nsarray

我有2个阵列从2个不同的API接收

预订阵列

{
            addrLine1 = "Al Thanyah Fifth, Dubai, United Arab Emirates";
            addrLine2 = "  ";
            apntDate = "14 Feb 2018";
            apntDt = "2018-02-14 15:31:30";
            apntTime = "03:31 pm";
            apptLat = "25.071102142334";
            apptLong = "55.142993927002";
            "appt_duration" = "";
            bid = 555;
            bookType = 1;
            cancelAmt = 30;
            "cat_id" = 591da979227951a10f004ad7;
            "cat_name" = "Car Wash";
            cid = 21;
            "coupon_discount" = 0;
            "customer_notes" = "";
            "distance_met" = 120;
            email = "fawasfais@gmail.com";
            expireTime = "";
            fname = Fawas;
            "job_imgs" = 0;
            "job_start_time" = "1970-01-01 00:00:00";
            "job_timer" = "";
            pPic = "https://s3.amazonaws.com/iserve/ProfileImages/20170720110011AM.png";
            "payment_type" = 1;
            phone = 568573570;
            "price_per_min" = 10;
            "pro_notes" = "";
            services = "5923f21c2279518a1661cb09,5923f22d2279513f1861cb09";
            status = 2;
            statusMsg = "Provider Accepted.";
            timer = "";
            "timer_status" = "";
            "visit_amount" = 60;
        }  

选择的服务数组

{
        "price_per_unit" = 30;
        "sub_cat_id" = 5923f21c2279518a1661cb09;
        "sub_cat_name" = SUV;
        unit = 1;
    },
        {
        "price_per_unit" = 45;
        "sub_cat_id" = 5923f22d2279513f1861cb09;
        "sub_cat_name" = Sedan;
        unit = 1;
    }
 {
        "price_per_unit" = 65;
        "sub_cat_id" = 5923f23e2279518a1661cb09;
        "sub_cat_name" = Bus;
        unit = 1;
    },
        {
        "price_per_unit" = 75;
        "sub_cat_id" = 5923f24f2279513f1861cb09;
        "sub_cat_name" = Lorry;
        unit = 1;
    }

我想将上述数组与" services"进行比较。来自第一个数组的键和" sub_cat_id"从第二个数组开始,最后打印包含车辆的公共服务ID的price_per_unit。

示例 - 在第一个数组中找到的5923f21c2279518a1661cb09,5923f22d2279513f1861cb09以便从第二个数组中打印两个ID的price_per_units - 30,45

有什么建议吗? (如果任何代码片段需要在评论中提及回答此问题,我将编辑并使用所需代码更新问题。

This is how I get the second array from the server

-(void)getServiceTypes
{
    NSDictionary *queryParams;
    queryParams = @{
                    @"ent_sess_token":flStrForStr([[NSUserDefaults standardUserDefaults] objectForKey:KDAcheckUserSessionToken]),
                    @"ent_dev_id":flStrForStr([[NSUserDefaults standardUserDefaults] objectForKey:kPMDDeviceIdKey]),
                   @"ent_catid":_dictAppointmentDetails[@"cat_id"]
                   };


    NetworkHandler *handler = [NetworkHandler sharedInstance];
    [handler composeRequestWithMethod:@"getSubCategory"
                              paramas:queryParams
                         onComplition:^(BOOL succeeded, NSDictionary *response) {
                             if (succeeded) {

                                 [self getServiceTypesResponse:response];
                             }
                         }];
    NSLog(@"param%@",queryParams);

}
-(void)getServiceTypesResponse:(NSDictionary *)response
{
    NSLog(@"GETSERVICETYPES%@",response);

    serviceTypeDict = response[@"data"];
    NSLog(@"SERVICETYPEDIC%@",serviceTypeDict);
    serviceTypeArray = response[@"data"];
    NSLog(@"SERVICETYPEARRAY%@",serviceTypeArray);
    serviceTypeIDArray = [[serviceTypeArray valueForKey:@"sub_cat_id"]copy];
    NSLog(@"SERVICETYPEIDARRAY%@",serviceTypeIDArray);



}

由于

2 个答案:

答案 0 :(得分:1)

让它在游乐场工作:

let booking: [String: Any] = [
    "services": "5923f21c2279518a1661cb09,5923f22d2279513f1861cb09",
    "status":2
]

let selectedServices: [[String: Any]] = [
    [
        "price_per_unit": 30,
        "sub_cat_id": "5923f21c2279518a1661cb09",
        "sub_cat_name": "SUV",
        "unit": 1
    ],
    [
        "price_per_unit": 45,
        "sub_cat_id": "5923f22d2279513f1861cb09",
        "sub_cat_name": "Sedan",
        "unit": 1
    ],
    [
        "price_per_unit": 65,
        "sub_cat_id": "5923f23e2279518a1661cb09",
        "sub_cat_name": "Bus",
        "unit": 1
    ],
    [
        "price_per_unit": 75,
        "sub_cat_id": "5923f24f2279513f1861cb09",
        "sub_cat_name": "Lorry",
        "unit": 1
    ]
]

if let bookingServices = booking["services"] as? String {
    let services: [String] = bookingServices.components(separatedBy: ",")

    let commonServices = selectedServices.filter({ services.contains( $0["sub_cat_id"] as? String ?? "" ) })
    print(commonServices)
}

Objective-C等价物:

NSDictionary *booking = @{
                                @"services": @"5923f21c2279518a1661cb09,5923f22d2279513f1861cb09",
                                @"status": @2
                                };

NSArray *selectedServices =  @[
             @{
              @"price_per_unit": @30,
              @"sub_cat_id": @"5923f21c2279518a1661cb09",
              @"sub_cat_name": @"SUV",
              @"unit": @1
              },
             @{
              @"price_per_unit": @45,
              @"sub_cat_id": @"5923f22d2279513f1861cb09",
              @"sub_cat_name": @"Sedan",
              @"unit": @1
              },
             @{
              @"price_per_unit": @65,
              @"sub_cat_id": @"5923f23e2279518a1661cb09",
              @"sub_cat_name": @"Bus",
              @"unit": @1
              },
             @{
              @"price_per_unit": @75,
              @"sub_cat_id": @"5923f24f2279513f1861cb09",
              @"sub_cat_name": @"Lorry",
              @"unit": @1
              }
             ];

NSString *servicesString = [booking valueForKey: @"services"];
NSArray *bookingServices = [servicesString componentsSeparatedByString:@","];

NSMutableArray *commonServices = [[NSMutableArray alloc] init];

for (NSDictionary *selectedService in selectedServices) {
    NSString *sub_cat_id = selectedService[@"sub_cat_id"];

    if([bookingServices containsObject: sub_cat_id]) {
        [commonServices addObject: selectedService];
    }
}

NSLog(@"%@", commonServices);

答案 1 :(得分:1)

我认为你应该使用NSPredicate,因为这是快速枚举。只需两行代码

我在这里使用你的演示内容。

NSDictionary *maindic = @{@"price_per_min" :@"10",
                                   @"services":@"5923f21c2279518a1661cb09,5923f22d2279513f1861cb09",
                                  };

    NSDictionary *dic1 =@{@"price_per_unit" :@"30",
                           @"sub_cat_id":@"5923f21c2279518a1661cb09",
                           };

    NSDictionary *dic2 =@{@"price_per_unit" :@"45",
                           @"sub_cat_id":@"5923f22d2279513f1861cb09",
                           };
    NSDictionary *dic3 =@{@"price_per_unit" :@"65",
                          @"sub_cat_id":@"5923f23e2279518a1661cb09",
                          };

    NSArray *mainArr=  @[dic1,dic2,dic3];

    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"sub_cat_id == '5923f21c2279518a1661cb09'"];
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"sub_cat_id == '5923f22d2279513f1861cb09'"];
    NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate1, predicate2]];

    NSArray *resultArray = [mainArr filteredArrayUsingPredicate:predicate];

,它将在resultArray中返回

{
    "price_per_unit" = 30;
    "sub_cat_id" = 5923f21c2279518a1661cb09;
},
{
    "price_per_unit" = 45;
    "sub_cat_id" = 5923f22d2279513f1861cb09;
}