Objective c 获取NSDictionary的NSArray的值列表
我得到了以下通知:Objective c 获取NSDictionary的NSArray的值列表,objective-c,nsarray,nsdictionary,nspredicate,Objective C,Nsarray,Nsdictionary,Nspredicate,我得到了以下通知: NSArray myArray = @[@{@300:@"5 min"}, @{@900:@"15 min"}, @{@1800:@"30 min"}, @{@3600:@"1 hour"}]; 我想要字典的价值列表: @[@"5 min",@"15 min",@"30 min",@"1 hour"] @[@300, @900, @1800, @3600
NSArray myArray = @[@{@300:@"5 min"},
@{@900:@"15 min"},
@{@1800:@"30 min"},
@{@3600:@"1 hour"}];
我想要字典的价值列表:
@[@"5 min",@"15 min",@"30 min",@"1 hour"]
@[@300, @900, @1800, @3600]
以及我的字典的关键列表:
@[@"5 min",@"15 min",@"30 min",@"1 hour"]
@[@300, @900, @1800, @3600]
最好的方法是什么?我在考虑谓词,但我不知道如何使用它?试试这个:
NSArray *myArray = @[@{@300:@"5 min"},
@{@900:@"15 min"},
@{@1800:@"30 min"},
@{@3600:@"1 hour"}];
NSMutableArray *keyArray = [[NSMutableArray alloc] init];
NSMutableArray *valueArray = [[NSMutableArray alloc] init];
for (NSDictionary *dictionary in myArray) {
for (NSString *key in dictionary) {
[keyArray addObject:key];
[valueArray addObject:[dictionary objectForKey:key]];
}
}
您可以使用dictionary属性allValues来获取dictionary的所有值 在您的案例中尝试此代码
NSArray *myArray = @[@{@300:@"5 min"},
@{@900:@"15 min"},
@{@1800:@"30 min"},
@{@3600:@"1 hour"}];
NSMutableArray *arr = [NSMutableArray array];
for (NSDictionary *dict in myArray) {
[arr addObject:[[dict allValues] objectAtIndex:0]];
}
NSLog(@"%@",arr);
注意:确保每个字典中只有一个值。
它会回来的
[
5分钟
15分钟
30分钟
1小时
]@johnyu的回答在技术上是正确的,但我看不出有任何理由包含二次循环,特别是如果数据结构保持不变的话
NSArray *myArray = @[@{@300:@"5 min"},
@{@900:@"15 min"},
@{@1800:@"30 min"},
@{@3600:@"1 hour"}];
NSMutableArray *arrayOfValues = [NSMutableArray new];
NSMutableArray *arrayOfKeys = [NSMutableArray new];
for (NSDictionary *dictionary in myArray) {
[arrayOfValues addObject:dictionary.allValues[0]];
[arrayOfKeys addObject:dictionary.allKeys[0]];
}
NSLog(@"%@",arrayOfKeys);
NSLog(@"%@",arrayOfValues);
如果没有一些代码来显示您希望如何进行这项工作,则很难确定您到底在追求什么,并且在这个问题上存在一些混乱 首先,谓词就是一个可以被证明为真或假的语句。谓词因此在逻辑表达式中使用,包括数据库查询中隐式使用的谓词,例如核心数据 如果我没看错你的问题,那不是你想要的。您想要的是降低数据模型的复杂性,在过程中删除一些多余的(人们希望如此)信息。字典数组的一种扁平化 很公平 我还可以看到谓词的混淆是如何产生的——它们通常是使用键值编码构造的。众所周知,KVC是一种非常强大的技术,可以实现您所追求的目标。它与逻辑语句没有多大关系 解决了这个问题后,使用KVC,您可以做您想做的事情,并且不需要太多麻烦。事情是这样的:
NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];
NSArray *keys = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];
简要解释如下:
我们想要的结果是
@allValues
或@allKeys
@unionofarray
操作符对从后面的表达式获得的数组进行并集,即将其展平为所需的数组
您为这种编码简单性付出的代价是,您必须将KVC密钥路径与集合运算符一起使用,它们只是代码中的字符串。因此,您将失去编译器在语法方面的任何帮助,并且它不会检查您输入的键是否存在于对象中。类似地,如果您键入错误或使用错误的运算符,调试器和错误消息也无济于事。这是我的第一个想法,但这是老派之王,我有一种方法可以使用
谓词来实现这一点。
?我已经尝试了您的解决方案,效果非常好。如果我找不到谓词的解决方案,我会将其作为适当的解决方案谢谢你注意到@iOSCoder,我已经修复了它。如果键已经是唯一的,那么使用多个字典有什么意义?一个简单的字典可以保存所有这些信息,你可以用相关的方法检索你的键/值。有趣的问题,但必须回答的问题是:你尝试了什么?告诉我们你迄今为止做了什么,以及为什么没有按计划进行。有趣的问题。我确实尝试过任何东西,但我非常确定,通过迭代NSArray并为每个字典填充一个新的NSArray,这是可能的。但我认为有一种更轻松的方法。差不多了P使用单个对象创建一个数组,该对象为数组。:)但事实上,allValues和allKeys方法似乎是更好的方法。这段代码中应该有2个未显式分配的NSArray,并且赋值应该类似于arrayOfValues=[Dictronial allValues];非常感谢您的完整回复!我不是KVC的专家,因为您解释道:“您的代码中只有字符串”,所以调试比较困难。但是objective c中的许多强大工具都使用字符串:(我无法告诉你我有多喜欢这个答案!非常感谢!)