来自NSMutableArray的NSMutableDictionary使用KVC

时间:2014-03-10 13:10:02

标签: ios iphone objective-c kvc

我有一个字典输入数组

myArray = (
    {
        name:"abc";
        time:"6:00";
    },
    {
        name:"xyz";
        time:"7:00";
    },
    .
    .
)

我想要输出字典,如下所示:

myDictionary = {
    "6:00":(
        {
            name:"abc";
            time:"6:00";
        },
        .
        .
     )
     "7:00":(
        {
            name:"xyz";
            time:"7:00";
        },
        .
        .
     )
}

我尝试了什么:

我使用这一行成功获得distinct times数组:

NSArray *arrTempKeys = [myArray valueForKeyPath:@"@distinctUnionOfObjects.Time"];

然后使用for loop内的arrTempKeys谓词来获取具有相同time值的所有词典:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"Date == %@",str];
NSArray *arrTemp = [myArray filteredArrayUsingPredicate:pred];

最后,我将此arrTemp指定为密钥time的对象,并获得了所需的结果。


我想要的是什么:

我知道有很多其他方法可以获得此输出。但我只想知道是否有任何单KVC编码行或任何其他最佳方式可用于此事。

3 个答案:

答案 0 :(得分:4)

你想要太多。只写一个简单的循环。它将是最有效,最清晰,也可能是最可靠的解决方案:

NSMutableDictionary* myDict = [NSMutableDictionary dictionary];
for (NSDictionary* innerDict in myArray) {
    NSString* time = innerDict[@"time"];
    NSMutableArray* innerArray = myDict[time];
    if (innerArray == nil) {
        innerArray = [NSMutableArray array];
        [myDict setValue:innerArray forKey:time];
    }
    [innerArray addObject:innerDict];
}

答案 1 :(得分:3)

NSDictionary可以在NSArray和KVC的帮助下完成此操作。

试试这个:

NSDictionary *myDictionary = [NSMutableDictionary dictionaryWithObjects:myArray
                                                                forKeys:[myArray valueForKey:@"time"];

这应该有效,因为NSArray的-valueForKey:版本返回了每个元素为键返回的值的数组。

警告:虽然上面的代码很简洁,似乎可以解决您的问题,但并非没有一些陷阱。主要的一个是字典只能有一个给定键的值,这意味着如果数组中的两个或多个条目具有相同的键@"time"值,则只有其中一个(可能是最后)将在结果字典中表示。此外,如果任何条目缺少@"time"的值,则该条目将以[NSNull null]作为其键。如上所述,如果有两个或更多个缺少time值,则只有一个将在字典中表示。

编辑:仔细查看您的问题,我发现项目中的时间不一定是明显的,所以Hot Licks的回答可能对您更有意义。

答案 2 :(得分:0)

不,没有。 KVC允许您导航关键路径,但它不会根据关键路径的内容以这种方式对数据进行整理。