我有一个问题,我很长时间都无法解决。我有来自服务器的JSON响应,它被解析为NSDictionary lastMsgs,如下图所示:
因此,例如1323它是一个键,它与NSDictionary(包含诸如body,subject等键和值之类的键)相关联。所以我需要以某种方式删除一个嵌套NSDictionary值的条目有条目:type = 1.我不知道该怎么做。我试着这样做:
NSMutableArray* _ModelVals = [[lastMsgs allValues] mutableCopy];
for (int i =0; i<[_ModelVals count]; i++) {
string_compare = [NSString stringWithFormat:@"%@" , [_ModelVals objectAtIndex:i]];
if ([string_compare rangeOfString:@"type = 1"].location != NSNotFound) {
[_ModelVals removeObjectAtIndex:i];
}
}
但它工作不正确并且不删除所有类型为1的条目。
所以问题 - 如何在嵌套的NSDictionary中实现这个并删除条目?
答案 0 :(得分:6)
字典中没有值“type = 1”。那就是日志。您可以使用[dict objectForKey:@"key"]
或dict[@"key"]
获取字典中键的值。
根据您的日志判断,类型似乎是NSNumber
,而不是NSString
。只需获取它的int
表示(假设类型是整数)并使用简单的C int
到int
比较。
你无法过滤那样的数组。您将跳过一个条目。如果您删除条目,则必须将i
减少1
。
或者使用这个更简单的解决方案:
NSSet *keys = [lastMsgs keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop) {
return [obj[@"type"] intValue] == 1;
}];
NSMutableDictionary *dict = [lastMsgs mutableCopy];
[dict removeObjectsForKeys:[keys allObjects]];
这将首先收集类型为1
的所有对象(词典)的键,然后从原始词典的可变副本中删除它们。
答案 1 :(得分:1)
在枚举时,您无法添加或删除集合中的对象。我会创建另一个数组,您可以存储对要删除的对象的引用,并在您循环后删除它们。