【发布时间】:2015-06-04 09:10:41
【问题描述】:
我有两个这样的字典数组
arrCurrent = [{
id = 1;
name = "Name1";
},{
id = 2;
name = "Name2";
},{
id = 3;
name = "Name3";
}];
arrUpdated = [{
id = 1;
name = "Name1 has changed";
},{
id = 2;
name = "Name2 has changed";
},{
id = 4;
name = "Name4 is a new item";
}];
我的要求是根据以下条件合并这两个数组
1) 如果 arrUpdated 包含新项目(具有新 id 的项目),则应将其添加为新项目。
2) 如果 arrUpdated 包含与 arrCurrent 包含的 id 相同的项目,则应将这些项目替换为更新后的项目
所以,最终的数组应该是这样的
arrFinal = [{
id = 1;
name = "Name1 has changed";
},{
id = 2;
name = "Name2 has changed";
},{
id = 3;
name = "Name3";
},{
id = 4;
name = "Name4 is a new item";
}];
希望我的要求很明确,最好的方法是什么?
这就是我正在尝试的方式。但是这种方法会得到重复的项目。另外,遍历数组也不是最好的方法
请注意:实际代码包含与上述数组名称不同的名称。但同样的逻辑
arrSavedSectors = arrCurrent
arrAllUpdatedSectors = arrUpdated
arrFilteredSectors = arrFinal
NSMutableArray *arrSavedSectors = [[NSMutableArray alloc]initWithArray: [dictionary objectForKey:@"ArrSectors"]];
NSMutableArray *arrFilteredSectors = [[NSMutableArray alloc]initWithArray:arrSavedSectors];
// add updated sectors to list
NSArray *arrAllUpdatedSectors = [NSArray arrayWithArray:[sectorDetails objectForKey:@"AllUpdatedSectors"]];
if([arrSavedSectors count] > 0){
// check for updated sectors (Which are already saved in the plist, but recently updated some details)
for(NSDictionary *dicSector in arrSavedSectors){
for(NSDictionary *dicUpdatedSector in arrAllUpdatedSectors){
if([[dicUpdatedSector objectForKey:@"id"] isEqualToString:[dicSector objectForKey:@"id"]]){
[arrFilteredSectors removeObject:dicSector];
[arrFilteredSectors addObject:dicUpdatedSector];
}
else{
[arrFilteredSectors addObject:dicUpdatedSector];
}
}
}
}
else{
[arrFilteredSectors addObjectsFromArray:arrAllUpdatedSectors];
}
【问题讨论】:
-
显示你目前拥有的代码。
-
参考 vikingosegundo 答案。这是可以接受的答案。
标签: ios objective-c nsarray nsdictionary