【问题标题】:Unable to get all Matching string from NSDictionary iOS无法从 NSDictionary iOS 获取所有匹配字符串
【发布时间】:2016-12-16 08:31:16
【问题描述】:

我是 iOS 新手,逻辑有点弱。

谁能帮帮我,

我想从 NSDictionary 中获取所有匹配的数据。

例如:

我的tempDict 是包含这个的 NSDictionary,

临时字典:

errorCode = 00;
errorMessage = "<null>";
pastConsultations =     (

            {
        date = "16 December 2016";
        day = Friday;
        doctorName = "<null>";
        localTime = "07:30 AM";
        symptoms = q;
        today = Yes;
    },
            {
        date = "16 December 2016";
        day = Friday;
        doctorName = "<null>";
        localTime = "07:30 AM";
        symptoms = g;
        today = Yes;
    },
            {
        date = "13 December 2016";
        day = Tuesday;
        doctorName = "<null>";
        localTime = "12:30 PM";
        symptoms = fever;
        today = No;
    }
);
upcomingConsultations =     (
            {
        date = "16 December 2016";
        day = Friday;
        localTime = "09:30 PM";
        symptoms = "";
        today = Yes;
    },
            {
        date = "16 December 2016";
        day = Friday;
        localTime = "09:30 PM";
        symptoms = chj;
        today = Yes;
    },
            {
        date = "18 December 2016";
        day = Sunday;
        localTime = "12:30 PM";
        symptoms = "test an incoming ";
        today = No;
    }
);
}

pastConsultations 键中,我想获取所有包含AM 的嵌套数据

即我的输出应该是:

{ //Array at 0th index
            date = "16 December 2016";
            day = Friday;
            doctorName = "<null>";
            localTime = "07:30 AM";
            symptoms = q;
            today = Yes;
        },
                { //Array at 1st index
            date = "16 December 2016";
            day = Friday;
            doctorName = "<null>";
            localTime = "07:30 AM";
            symptoms = g;
            today = Yes;
        }
}

这是我尝试过的代码,但它不起作用,请帮助我在哪里出错?

NSArray *allKeys;
        for (int i=0; i<[tempDict count]; i++) {
           allKeys = [[[tempDict valueForKey:@"upcomingConsultations"] objectAtIndex:i] allKeys];



            NSString *targetKey = nil;
            // NSArray *allKeys = [[tempDict valueForKeyPath:@"pastConsultations"] allKeys];
            for (int j = 0; j < [allKeys count]; ++j) {
                NSString *key = [allKeys objectAtIndex:i];
                NSString *obj = [[[tempDict valueForKey:@"upcomingConsultations"] objectAtIndex:i] objectForKey:key];
                if ([obj rangeOfString:searchText].location != NSNotFound) { // searchedString is what you're looking for
                    targetKey = key;
                    NSLog(@"found match");
                    break;
                }
            }
        }

【问题讨论】:

  • 是否有任何错误或您没有得到结果?
  • 没有得到结果

标签: ios objective-c iphone nsmutablearray nsdictionary


【解决方案1】:

试试这个代码:

假设您已经加载了 tempDict 字典。

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

NSArray *pastArray = [tempDict objectForKey:@"pastConsultations"];
for (int i=0;i<[pastArray count]; i++) {
  NSDictionary *eachPast = [pastArray objectAtIndex:i];
  NSString *time = [eachPast objectForKey:@"localTime"];
  if (![time rangeOfString:@"AM"].location == NSNotFound) {
    [morningPastArr addObject:eachPast];
  }
}

// finally you will have like what you need in morningPastArr.

编辑: 如果您想组合搜索结果,例如 AM 条目和 Friday only 的结果,您可以这样做:

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

NSArray *pastArray = [tempDict objectForKey:@"pastConsultations"];
for (int i=0;i<[pastArray count]; i++) {
  NSDictionary *eachPast = [pastArray objectAtIndex:i];
  NSString *time = [eachPast objectForKey:@"localTime"];
  NSString *day = [eachPast objectForKey:@"day"];
  if ((![time rangeOfString:@"AM"].location == NSNotFound)&&([day isEqualToString:@"Friday"])) {
    [morningAndFridayPastArr addObject:eachPast];
  }
}

【讨论】:

  • 为什么要使用循环?谓词比这更有效。
  • 是的,我同意。您的代码效率更高。但我不像你那么专业。我的代码通常更容易被新手(比如我自己)理解。很抱歉写了长代码。
  • 这工作顺利,我是 iOS 新手,我不知道谓词。你能说我如何使用谓词来实现这一点吗?
  • 我可以搜索pastConsultations 中的所有键,而不是只搜索localTime 吗?
  • 我不太明白你的意思。如果您正在搜索特定的东西,您可以用您想要的其他东西替换键 - [eachPast objectForKey:@"date"];那么您也可以添加对日期的要求并使用 if 语句来检查它们。
【解决方案2】:

您可以使用NSPredicate,如下所示:

NSPredicate *predicate;
NSMutableArray *filteredData=[[NSMutableArray alloc]init];

predicate = [NSPredicate predicateWithFormat:@"localTime contains[c] %@",@"AM"];
//OR Use below predicate as suggested by Rishi
predicate = [NSPredicate predicateWithFormat:@"localTime ENDSWITH 'AM'"];

filteredData=[[[tempDict valueForKey:@"pastConsultations"] filteredArrayUsingPredicate:predicate]] mutableCopy];

希望这会有所帮助。

【讨论】:

  • 它返回 Empty filteredData
  • 检查编辑后的答案,同时检查tempDict是否不是nil@Appledeveloper
  • 我仍然得到 filteredData 因为 nil 也检查了 tempDict 不是 nil
  • 试试这个谓词 = [NSPredicate predicateWithFormat:@"localTime ENDSWITH 'AM'"];
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多