iOS 比较 NSDictionary 值

iOS comparing NSDictionary values

我正在获取两个 JSON 并将它们分别存储为 NSArrayNSDictionary

这就是 JSON 数据结构的样子

(
        {
            Cells = (
                {
                    ValueName = "name";
                    Text = "John Appleseed";
                },
                {
                    "Option": {
                        "Text": "19"
                    },
                    ValueName = "age"
                }, etc...
            )
        },
        {
           Cells = (
                {
                    ValueName = "name";
                    Text = "John Appleseed";
                },
                {
                    ValueName = "age",
                    "Option": {
                        "Text": "19"
                    }
                }, etc...
            )
        }
)

{
    "map": {
        "first": "name",
        "second": "age"
    }, etc...
}   

这两个有值需要交叉引用(因为一个包含所有数据(allData),另一个包含一个"map"(mapData)是什么数据需要)。

我如何将 allData 的所有值与 mapData 的所有值进行比较,同时尽可能记住简单性和记忆性?

一个很好的方法是使用 containsObject[allData allValues][mapData allValues] 匹配,并返回 NSArray 与匹配的 object。 las,事实并非如此。该方法完美地说明了我希望实现的目标。

我最初的方法很慢,占用内存而且丑陋(凭记忆写的):

NSArray *allData = [NSJSONSerialization JSONObjectWithData:allDataJSON options:kNilOptions error:&JSONSerializationError];
NSDictionary *mapData = [NSJSONSerialization JSONObjectWithData:mapDataJSON options:kNilOptions error:&JSONSerializationError];
NSMutableDictionary *resultData = [[NSMutableDictionary alloc] init];

for (int count = 0; count<allData.count; count++) {
    id dataValue = [allData objectAtIndex:count];
    for (id key in mapData) {
        if ([[mapData objectForKey:key] containsObject:dataValue]) {
            [resultData setObject:[dataValue objectForKey:@"value"] forKey:key]
        }
    }
}

能够引用匹配值的每个匹配项也很重要(正如我的方法所做的那样)。


这不是基于意见的问题,因为优化和内存使用不是意见。

我发现使用此数据模型内存效率高且速度非常快(平均时间为 0.001 秒,allData 的长度为 1000 行)。


通过从 mapData 中提取所有想要的值并将它们放在 NSArray 中,这些值可以很容易地与 allData.

的值相匹配

当循环遍历 mapDataArray 时,可以创建一个辅助循环来遍历 allData 的值。如果mapDataArray containsObject returns true,数据可以存储在一个瞬时存储字典中。

这样可以轻松管理需要哪些数据以及可以忽略哪些数据。重要的是在第一个循环内创建瞬时存储(稍后您将看到)。

如果找到 mapDataArray 中的所有值(通过检查 mapDataArray.countmomentaryData.count),我们可以 break 当前循环(从而节省时间和内存)。

仅查看代码以了解实际情况可能更容易。


问题中引用的数据对象。

NSArray *allData = [NSJSONSerialization JSONObjectWithData:allDataJSON options:kNilOptions error:&JSONSerializationError];
NSDictionary *mapData = [NSJSONSerialization JSONObjectWithData:mapDataJSON options:kNilOptions error:&JSONSerializationError];

创建 mapDataArray,遍历它,创建瞬时字典,附加找到的对象并将瞬时数据附加到 resultData

NSArray *mapDataArray = [[NSArray alloc] init];

mapDataArray = [[mapDataArray arrayByAddingObjectsFromArray:[[mapData objectForKey:@"map"] objectForKey:@"first"]] arrayByAddingObjectsFromArray:[[mapData objectForKey:@"map"] objectForKey:@"second"]];
mapDataArray = [[NSOrderedSet orderedSetWithArray:mapDataArray] array]; //Remove duplicates

NSMutableDictionary *resultData = [[NSMutableDictionary alloc] init];
for (int count = 0; count<allData.count; count++) {
    NSMutableDictionary *momentaryData = [[NSMutableDictionary alloc] init];
    int dataNumber = count;

    NSArray *literal = [[allData objectAtIndex:dataNumber] objectForKey:@"Cells"];
    for (int count = 0; count<literal.count; count++) {
        id literal = [[[allData objectAtIndex:dataNumber] objectForKey:@"Cells"] objectAtIndex:count];

        if ([mapDataArray containsObject:[literal objectForKey:@"ValueName"]]) {
            id value = [literal objectForKey:@"Text"];

            if (!value) {
                value = [literal objectForKey:@"Option"];
                if (value && ![value isEqual:[NSNull null]]) {
                    value = [value objectForKey:@"Text"];
                } else {
                    value = @"";
                }
            }

            [momentaryData setObject:[NSString stringWithFormat:@"%@", value] forKey:[literal objectForKey:@"ValueName"]];

            if (mapDataArray.count == momentaryData.count) {
                break; //We have what we came for...
            }
        }
    }

    [resultData setObject:momentaryData forKey:[NSString stringWithFormat:@"%d", dataNumber]];
}

您可以使用 isEqual: 比较 arraysdictionaries

对于arrays比较arrays的元素个数是否相同或者匹配的元素是否相等

对于 dictionaries 它检查两者是否具有相同数量的键,一组键是否相等以及一个 dictionary 中的每个键是否与另一个中的匹配键具有相同的值dictionary.