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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:24:00