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"];
简要解释如下:

我们想要的结果是

  • 每个字典的所有值(或键),获得一个值(或键)数组
  • 然后我们要将这些阵列展平为单个阵列 要使用KVC从字典中获取所有值(或键),专用键分别为
    @allValues
    @allKeys

    @unionofarray
    操作符对从后面的表达式获得的数组进行并集,即将其展平为所需的数组


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

    这是我的第一个想法,但这是老派之王,我有一种方法可以使用
    谓词来实现这一点。
    ?我已经尝试了您的解决方案,效果非常好。如果我找不到谓词的解决方案,我会将其作为适当的解决方案谢谢你注意到@iOSCoder,我已经修复了它。如果键已经是唯一的,那么使用多个字典有什么意义?一个简单的字典可以保存所有这些信息,你可以用相关的方法检索你的键/值。有趣的问题,但必须回答的问题是:你尝试了什么?告诉我们你迄今为止做了什么,以及为什么没有按计划进行。有趣的问题。我确实尝试过任何东西,但我非常确定,通过迭代NSArray并为每个字典填充一个新的NSArray,这是可能的。但我认为有一种更轻松的方法。差不多了P使用单个对象创建一个数组,该对象为数组。:)但事实上,allValues和allKeys方法似乎是更好的方法。这段代码中应该有2个未显式分配的NSArray,并且赋值应该类似于arrayOfValues=[Dictronial allValues];非常感谢您的完整回复!我不是KVC的专家,因为您解释道:“您的代码中只有字符串”,所以调试比较困难。但是objective c中的许多强大工具都使用字符串:(我无法告诉你我有多喜欢这个答案!非常感谢!)