我有一个NSMutableDictionary * A(来自in.plist)。我需要通过自动重构的整数为A中的每个键和A的后代字典添加前缀,并将结果保存在NSMutableDictionary B中(保存为out.plist)。
实现这一目标的最佳方法是什么?递归?循环? Fastenum?
PS:我们事先不知道字典A的结构。它可以包括字典数组字典......等等示例:
输入和输出字典之间唯一的区别是键名。
我在plist文件中找到了perl regex的解决方法:
cat in.plist | perl -ne 's/<key>/sprintf("<key>%02d -",($INDEX++))/xe;print $_' > out.plist
像魅力一样,但更喜欢Objective-c方式。
答案 0 :(得分:2)
这有点奇怪,但这基本上是你想要做的。创建一个新的NSMutableDictionary。对原始字典进行深度优先遍历,每次遇到密钥时,在将其设置到新字典之前添加前面的数字。这是一个示例实现(用浏览器编写,所以 caveat executor ):
NSDictionary *numberDict(NSDictionary *original) {
__block int counter = 1;
__block id (^processItem)(id);
processItem = ^(id item) {
id result = item;
if ([item isKindOfClass:[NSArray class]]) {
result = [NSMutableArray array];
[item enumerateObjectsUsingBlock:^(id arrayElement, NSUInteger index, BOOL *stop) {
[result addObject:processItem(arrayElement)];
}];
} else if ([item isKindOfClass:[NSDictionary class]]) {
result = [NSMutableDictionary dictionary];
[item enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) {
NSString *newKey = [NSString stringWithFormat:@"%d - %@", counter++, key];
[result setObject:processItem(value) forKey:newKey];
}];
}
return result;
};
return processItem(original);
}
显然这不会保留字典键的顺序,因为字典键实际上没有要保留的顺序,但是你已经表明你已经知道并且可以使用它。