2

我有一个很长时间无法解决的问题。我有一个来自服务器的 JSON 响应,它被解析为 NSDictionary lastMsgs,如下图所示: 在此处输入图像描述

因此,例如 1323 它是一个键,它与 NSDictionary 相关联(其中包含诸如正文、主题等和值之类的键)。因此,我需要以某种方式删除嵌套 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];
        }

    }

但它工作不正确,并没有删除所有 type = 1 的条目。

所以问题 - 我如何实现这个并删除嵌套 NSDictionary 中的条目?

4

2 回答 2

6

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

从你的日志来看,类型似乎是一个NSNumber,而不是一个NSString。只需获取int它的表示形式(假设类型是整数)并使用简单的 Cint进行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然后从原始字典的可变副本中删除这些键。

于 2013-01-21T15:17:55.693 回答
1

You cannot add or remove objects from a collection while enumerating though it. I would create a another array that you can store references to the objects that you want to delete and remove them after you have looped though it.

于 2013-01-21T15:14:06.190 回答