比较两个NSDictionaries和Find Difference

时间:2016-07-14 13:25:38

标签: ios objective-c uitableview nsdictionary

我正在开发一个iOS应用程序,我将从服务器获取一个JSON对象,该对象将填充在UITableView上。

用户可以在tableview上更改值,从而生成新的JSON。 现在我想只将delta(两个JSON对象的差异)发送回服务器。 我知道我可以遍历两个对象来寻找delta。但只是想知道这个问题是否有任何简单的解决方案。

例如:

NSDictionary *dict1 = {@"Name" : "John", @"Deptt" : @"IT"};
NSDictionary *dict2 = {@"Name" : "Mary", @"Deptt" : @"IT"};

Delta = {@"Name" : "Mary"}

考虑到新值,Mary为密钥名称;

提前致谢

3 个答案:

答案 0 :(得分:4)

isEqualToDictionary:返回一个布尔值,指示接收字典的内容是否等于另一个给定字典的内容。

if ([NSDictionary1 isEqualToDictionary:NSDictionary2) {
   NSLog(@"The two dictionaries are equal.");
}

如果两个词典各自具有相同数量的条目,则两个词典具有相同的内容;对于给定的键,每个词典中的相应值对象满足isEqual:测试。

答案 1 :(得分:2)

以下是如何获取具有不匹配值的所有键。如何处理这些键是应用程序级别的问题,但是最具信息性的结构将包括来自两个词典的不匹配值的数组,以及处理来自另一个中不存在的键的键:

NSMutableDictionary *result = [@{} mutableCopy];

// notice that this will neglect keys in dict2 which are not in dict1
for (NSString *key in [dict1 allKeys]) {
    id value1 = dict1[key];
    id value2 = dict2[key];
    if (![value1 equals:value2]) {
        // since the values might be mismatched because value2 is nil
        value2 = (value2)? value2 : [NSNull null];
        result[key] = @[value1, value2];
    }
}

// for keys in dict2 that we didn't check because they're not in dict1
NSMutableSet *set1 = [NSMutableSet setWithArray:[dict1 allKeys]];
NSMutableSet *set2 = [NSMutableSet setWithArray:[dict2 allKeys]];

for (NSString *key in [set2 minusSet:set1]) {
    result[key] = @[[NSNull null], dict2[key]];
}

当然有更经济的方法,但这段代码针对教学进行了优化。

答案 2 :(得分:1)

只需逐个列举并比较字典即可。这样会输出任何差异以及两侧的任何不匹配键,您可以根据要包含的内容来调整逻辑。

- (NSDictionary *)delta:(NSDictionary *)dictionary
{
    NSMutableDictionary *result = NSMutableDictionary.dictionary;

    // Find objects in self that don't exist or are different in the other dictionary
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        id otherObj = dictionary[key];

        if (![obj isEqual:otherObj]) {
            result[key] = obj;
        }
    }];

    // Find objects in the other dictionary that don't exist in self
    [dictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        id selfObj = self[key];

        if (!selfObj) {
            result[key] = obj;
        }
    }];

    return result;
}