获取NSDictionary的NSArray的值列表

时间:2013-08-26 10:55:40

标签: objective-c nsarray nsdictionary nspredicate

我有以下NSArray:

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]

最好的方法是什么?我在考虑谓词,但我不知道如何使用它?

4 个答案:

答案 0 :(得分:9)

如果没有一些代码来展示你想要如何解决这个问题,很难确切地知道你的目标是什么,并且问题中存在一些混淆。

首先,谓词就是这样 - 一个可以证明是真或假的陈述。因此,谓词在逻辑表达式中使用,包括在数据库查询中隐式使用的那些 - 例如核心数据。

如果我正确地阅读了你的问题,那就是你想要什么。你想要的是降低数据模型的复杂性,去除过程中的一些过剩(人们希望)的信息。一种字典数组的扁平化。

足够公平。

我还可以看到与谓词的混淆是如何产生的 - 它们通常是使用键值编码构建的。众所周知,KVC是一种非常强大的技术,可以完成你所追求的目标。它与逻辑陈述没什么关系。

清理完毕后,通过KVC,你可以做你想做的事,而且可以轻松搞定。它是这样的:

NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];

NSArray *keys   = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];

可能会有一个简短的解释:

我们想要的结果是

  1. 每个字典的所有值(或键),获取值(或键)数组的数组
  2. 然后我们想将这些数组展平成一个数组。
  3. 要使用KVC从字典中获取所有值(或键),特殊键分别为@allValues@allKeys

    @unionOfArrays运算符组合从其后面的表达式获得的数组,即将其展平为所需的数组。

    您为此编码简单性所付出的代价是您必须将KVC密钥路径与集合运算符一起使用,集合运算符只是代码中的字符串。因此,您失去了编译器的任何语法帮助,并且它不会检查您输入的键是否存在于对象中。同样,例如,如果输入错误或使用了错误的运算符,则调试器和错误消息将无用。

答案 1 :(得分:1)

您可以使用字典属性allValues来获取字典的所有值。

在您的案例中尝试此代码

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小时

答案 2 :(得分: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);

答案 3 :(得分:0)

试试这个:

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]];
    }
}