如何使用NSPredicate从NSDictionary中获取所有Water键对应的值
使用NSPredicate从字典中提取指定键对应值的方法
前置注意事项
Foundation框架中的NSDictionary是键唯一的哈希表结构,你给出的初始化代码中重复为@"Water"键赋值,最终生成的字典里@"Water"仅会保留最后一个值@"value2",无法同时存储value1和value2。如果需要实现同一键对应多个值的检索,通常有两种常见实现方案:
方案1:键值对存入数组后过滤
如果你的数据源是独立的键值对集合,可以先把所有键值对存入数组,再用NSPredicate过滤:
// 构造支持同键多值的数据源,每个元素为@[键, 值]格式的数组 NSArray *keyValuePairs = @[ @[@"Water", @"value1"], @[@"Water", @"value2"], @[@"Earth", @"value3"] ]; // 构造匹配规则:匹配键等于@"Water"的条目 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self[0] == %@", @"Water"]; // 过滤得到符合条件的键值对 NSArray *filteredPairs = [keyValuePairs filteredArrayUsingPredicate:predicate]; // 提取所有对应的值,得到结果@[@"value1", @"value2"] NSArray *waterValues = [filteredPairs valueForKeyPath:@"@unionOfObjects[1]"];
方案2:字典数组过滤(最常见业务场景)
如果你的数据源是多个字典组成的数组,每个字典存储类型和数值字段,过滤代码如下:
// 构造示例数据源 NSArray *dataArray = @[ @{@"type": @"Water", @"value": @"value1"}, @{@"type": @"Water", @"value": @"value2"}, @{@"type": @"Earth", @"value": @"value3"} ]; // 构造匹配规则:匹配type字段等于@"Water"的字典 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == %@", @"Water"]; // 过滤得到符合条件的字典集合 NSArray *filteredDicts = [dataArray filteredArrayUsingPredicate:predicate]; // 提取所有value值,得到结果@[@"value1", @"value2"] NSArray *waterValues = [filteredDicts valueForKey:@"value"];
普通唯一键字典取值
如果是常规键唯一的NSDictionary,不需要用NSPredicate,直接通过键取值即可:
NSDictionary *myDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"Water", @"value3", @"Earth" ,nil]; NSString *waterValue = myDictionary[@"Water"];
内容的提问来源于stack exchange,提问作者stefanosn
相关产品推荐
相关产品推荐

