2016-07-14 111 views
3

我正在研究iOS应用程序,我将从服务器获取JSON对象,该对象将填充到UITableView上。比较两个NSDictionaries并查找差异

用户可以更改tableview的值,因此导致新的JSON。 现在我只想发送增量(差异的两个JSON对象)回服务器。 我知道我可以遍历这两个对象找到三角洲。但只是想知道这个问题是否有任何简单的解决方案。

例:

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

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

考虑新的价值是玛丽的键名;

提前感谢

+0

与约翰相比,你如何将玛丽当作价值? –

+0

在比较字典下检查[此链接](http://rypress.com/tutorials/objective-c/data-types/nsdictionary)。如果你的字典在密钥方面是相同的,你可以做一个for循环,并将'dict1'中的密钥值与'dict2'进行比较。 – Adrian

回答

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]]; 
} 

有肯定是更经济的方法,但是这个代码是针对指令进行优化的。

+1

这是一个创建可变字典的有趣方法:) – Droppy

1

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

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

两个字典具有相等的内容,如果它们各自持有相同数目的条目,并且对于给定的键,在各词典中的相应值的对象满足isEqual:测试。

+0

这没有任何答案。 @Yukta要求增量,如果增量存在,则不是布尔值。 – raistlin