You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从NSJSONSerialization解析的字典数组中提取value为1的day和hour?

筛选NSJSONSerialization返回数组中value为1的条目并提取day和hour

嗨,我来帮你搞定这个需求!你已经通过NSJSONSerialization拿到了目标字典数组,现在要提取所有value为1的条目对应的day和hour,这里有几种实用的实现方式,还帮你处理了数组里那个key不一致的小问题(有个条目用了val而不是value):

方式一:基础循环遍历(直观易懂)

这是最直接的写法,逻辑清晰,适合快速上手:

NSError *parseError = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData 
                                                    options:NSJSONReadingMutableContainers 
                                                      error:&parseError];

// 用来存放筛选后的结果
NSMutableArray *targetEntries = [NSMutableArray array];

if (!parseError && jsonArray) {
    for (NSDictionary *entry in jsonArray) {
        // 兼容key为value和val的情况,避免漏掉数据
        NSNumber *valueNum = entry[@"value"] ?: entry[@"val"];
        // 判断value是否为1
        if ([valueNum integerValue] == 1) {
            // 提取day和hour,存成新字典(也可以替换成自定义模型)
            NSDictionary *resultDict = @{
                @"day": entry[@"day"],
                @"hour": entry[@"hour"]
            };
            [targetEntries addObject:resultDict];
        }
    }
}

// 现在targetEntries里就是你要的所有符合条件的day和hour数据
NSLog(@"筛选结果:%@", targetEntries);

方式二:用NSPredicate筛选(更简洁)

如果想让代码更紧凑,可以借助NSPredicate做筛选,不过要先统一数组里的key:

NSError *parseError = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:responseData 
                                                    options:NSJSONReadingMutableContainers 
                                                      error:&parseError];

if (!parseError && jsonArray) {
    // 先统一字典的key,把val替换成value,避免筛选遗漏
    NSArray *normalizedArray = [jsonArray valueForKeyPath:@"@{day:day, hour:hour, value:value ?: val}"];
    
    // 创建筛选条件:value等于1
    NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"value == 1"];
    NSArray *filteredEntries = [normalizedArray filteredArrayUsingPredicate:filterPredicate];
    
    // 如果只需要day和hour,可以再提取一次
    NSArray *finalResult = [filteredEntries valueForKeyPath:@"@{day:day, hour:hour}"];
    NSLog(@"最终结果:%@", finalResult);
}

小提醒

  • 一定要处理JSON解析时的错误(比如parseError),避免出现意外崩溃;
  • 你的原始数组里有一个条目用了val作为key,不是统一的value,所以代码里做了兼容处理,不然会漏掉这条数据;
  • 如果数据量很大,循环遍历的性能会更稳定,NSPredicate在日常场景下差异不大,但大数据量下可能稍慢一点。

内容的提问来源于stack exchange,提问作者humble_pie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:37