如何从NSDictionary中删除一个条目,它是NSDictionary的元素?

时间:2013-01-21 15:07:54

标签: ios objective-c nsdictionary

我有一个问题,我很长时间都无法解决。我有来自服务器的JSON响应,它被解析为NSDictionary lastMsgs,如下图所示: enter image description here

因此,例如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中实现这个并删除条目?

2 个答案:

答案 0 :(得分:6)

字典中没有值“type = 1”。那就是日志。您可以使用[dict objectForKey:@"key"]dict[@"key"]获取字典中键的值。

根据您的日志判断,类型似乎是NSNumber,而不是NSString。只需获取它的int表示(假设类型是整数)并使用简单的C intint比较。

你无法过滤那样的数组。您将跳过一个条目。如果您删除条目,则必须将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)

在枚举时,您无法添加或删除集合中的对象。我会创建另一个数组,您可以存储对要删除的对象的引用,并在您循环后删除它们。