我需要将两个NSArray/ nsdictionary组合在一起



我有两个plist文件,我使用作为数据源在我的应用程序中创建NSArrayNSDictionaries

我希望CSV文件的输出看起来像:

exerciseName, muscleGroup, description
Barbell Curl, Biceps, This is a bicep exercise

问题是,我需要首先组合两个nsdictionary。一个有exerciseName和muscleName,而另一个有exerciseDescription。但是我需要有一个字典数组,每个练习对象都有三个键。

我使用以下代码来构建主NSMutableArray

if (muscleArray == nil)
    {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"data" ofType:@"plist"];
        NSMutableArray *rootLevel = [[NSMutableArray alloc]initWithContentsOfFile:path];
        self.muscleArray = rootLevel;
    }
    NSMutableArray *arrayForSearching = [NSMutableArray array];
    for (NSDictionary *muscleDict in self.muscleArray)
        for (NSDictionary *excerciseDict in [muscleDict objectForKey:@"exercises"])
            [arrayForSearching addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                                          [excerciseDict objectForKey:@"exerciseName"], @"exerciseName",
                                          [muscleDict objectForKey:@"muscleName"], @"muscleName", nil]];
    self.exerciseArray = arrayForSearching;

我使用下面的代码来构建NSDictionary,它具有exerciseDescription键

    NSString *exerciseNameString =self.exerciseName;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions" ofType:@"plist"];
    NSDictionary *exerciseDescription = [NSDictionary dictionaryWithContentsOfFile:path];
    NSString *description = [exerciseDescription objectForKey:exerciseNameString];

您显然知道如何遍历和创建字典,那么问题在哪里呢?

遍历exerciseArray,并向它的每个字典添加一个练习描述。然而,这似乎非常低效,您可能应该重新考虑整个事情。为什么不将它们以现成的格式存储在磁盘上呢?

数组用于重要项的顺序。这似乎并不重要,为什么不把它们保留为nsdictionary呢?如果需要访问字典中的所有键,只需调用allKeys

编辑:像这样?
NSString *path = [[NSBundle mainBundle] pathForResource:@"ExerciseDescriptions"
    ofType:@"plist"];
NSDictionary *descriptions = [NSDictionary dictionaryWithContentsOfFile:path];
NSMutableArray *exercises = self.exerciseArray;
for (NSInteger i = 0; i < [exercises count]; i++) {
    NSMutableDictionary *dict = [[exercises objectAtIndex:i] mutableCopy];
    NSString *name = [dict valueForKey:@"exerciseName"];
    NSString *desc = [descriptions valueForKey:name];
    if (desc) {
        [dict setValue:desc forKey:@"exerciseDescription"];
        [exercises replaceObjectAtIndex:i withObject:dict];
    }
    [dict release];
}

我创建了以下项目来解决合并从plists创建的两个字典的需要:https://github.com/bumboarder6/NSDictionary-merge

即使你的两个字典或数组之间有一些重复的条目,它也会工作,它也会递归合并,所以你会得到整个pllist的合并,即使它包含字典的字典或字典的数组(等等)

最新更新