【问题标题】:How to Filter the NSMutableArray containing the NSDictionary in ios如何在ios中过滤包含NSDictionary的NSMutableArray
【发布时间】:2015-11-25 12:25:11
【问题描述】:

大家好,在我的项目中,我有一个 NSMutable 数组,其中包含一个 NSDictionary

我完成了按键和值的过滤

 NSPredicate * prediStr=[NSPredicate predicateWithFormat:@"BusAC == %@",@"AC"];
 filteredArray = [NSMutableArray arrayWithArray:[totDictArray filteredArrayUsingPredicate:prediStr]];

然后我用数组值过滤了键

for (int i=0; i<arr.count; i++)
 {
   NSPredicate * prediStr=[NSPredicate predicateWithFormat:@"TravelsName IN %@",arr[i]];
   filteredArray = [NSMutableArray arrayWithArray:[filteredArray filteredArrayUsingPredicate:prediStr]];                
 }

,这里我的问题是我想过滤包含字典的数组值在这里我的数组值:

(
        {
        Boarding =         (
                        {
                "board_id" = 0;
                "board_value" = "CMBT Omini BS";
            },
                        {
                "board_id" = 1;
                "board_value" = CMBT;
            },
                        {
                "board_id" = 2;
                "board_value" = Thambaram;
            }
        );
        BusAC = "A/C";
        BusFare = 550;
        BusType = "Semi Sleeper";
        TravelsName = "ABC Travels";
    },
        {
        Boarding =         (
                        {
                "board_id" = 0;
                "board_value" = CMBT;
            },
                        {
                "board_id" = 1;
                "board_value" = Guindy;
            },
                        {
                "board_id" = 2;
                "board_value" = Thambaram;
            }
        );
        BusAC = "A/C";
        BusFare = 600;
        BusType = Seater;
        TravelsName = "Arulmigu Aandal Azahagar Madurai Express";
    },
        {
        Boarding =         (
                        {
                "board_id" = 0;
                "board_value" = "CMBT Omini BS";
            },
                        {
                "board_id" = 1;
                "board_value" = CMBT;
            },
                        {
                "board_id" = 2;
                "board_value" = Thambaram;
            }
        );
        BusAC = "A/C";
        BusFare = 1250;
        BusType = Sleeper;
        TravelsName = "GSP  Travels";
    },
        {
        Boarding =         (
                        {
                "board_id" = 0;
                "board_value" = CMBT;
            },
                        {
                "board_id" = 1;
                "board_value" = Guindy;
            },
                        {
                "board_id" = 2;
                "board_value" = Velachery;
            }
        );
        BusAC = "Non A/C";
        BusFare = 350;
        BusType = "Semi Sleeper";
        TravelsName = "Madura  Travels";
    }
)

在这个我想过滤

 Boarding Values
(
    CMBT,
    Guindy

) & 
BusAC Value A/C

帮帮我

【问题讨论】:

    标签: objective-c nsmutablearray nspredicate nsmutabledictionary


    【解决方案1】:

    据我了解,您需要对字典数组进行排序,并且在每个字典中您需要对一些内部数组进行排序。所以实际上你需要用局部排序的结果修改每个内部数组,然后对这个全局数组进行排序。 其实NSPredicate并没有修改元素,所以我建议把这个字典“解包”成:

    .....
    {
        BusAC = "A/C";
        BusFare = 600;
        BusType = Seater;
        TravelsName = "Arulmigu Aandal Azahagar Madurai Express";
        "board_id" = 0;
        "board_value" = CMBT;
    },
        {
        BusAC = "A/C";
        BusFare = 600;
        BusType = Seater;
        TravelsName = "Arulmigu Aandal Azahagar Madurai Express";
        "board_id" = 1;
        "board_value" = Guindy;
    },
    .....
    

    为方便起见,我建议使用LinqToObjectiveC,或任何其他解决方案。

     NSArray *unpackedArray = [testArray linq_selectMany:^id(NSDictionary<NSString *,id> *item) {
        NSMutableDictionary *resultDic = [item mutableCopy];
        [resultDic removeObjectForKey:@"Boarding"];
        NSArray *boarding = item[@"Boarding"];
        return [boarding linq_select:^id(NSDictionary *item) {
            return [item linq_Merge:resultDic];
        }];
    }];
    NSLog(@"unpacked: %@", unpackedArray );
    

    然后您可以根据需要使用谓词或其他方式对其进行过滤

    unpackedArray = [[unpackedArray linq_where:^BOOL(NSDictionary *item) {
        return [@[@"CMBT", @"Guindy"] containsObject:item[@"board_value"]];
    }] linq_where:^BOOL(NSDictionary *item) {
        return [item[@"BusAC"] isEqualToString:@"A/C"];
    }];
    NSLog(@"unpacked: %@", unpackedArray );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多