在一个未知的NSMutableArray深度中search一个值

好吧,我问了一个错误的问题,所以我编辑了原来的问题。

我在数组中存储数组,以及NSDictionaries。 它是一种实用的应用程序,没有设置结构,用户可以根据需要input嵌套信息。

理想情况下,我需要一个方法来滚动我的数组的所有内容给定一个参数(一种类,也许是一个字典键)。 这是一个例子..

NSMutableArray *array = [[NSMutableArray alloc]init]; NSMutableDictionary *enteredItem = [[NSMutableDictionary alloc]init]; [enteredItem setObject:@"i'm a title" forKey:@"title"]; [enteredItem setObject:@"i'm an id" forKey:@"id"]; [enteredItem setObject:@"i'm a description" forKey:@"description"]; [enteredItem setObject:@"i'm a timestamp" forKey:@"timestamp"]; [enteredItem setObject:array forKey:@"items"]; [array addObject:enteredItem]; [array addObject:anotherDictionary]; [array addObject:moreDictionaries]; 

所以在上面的例子中,我需要find包含@“我是一个id”的字典(并返回它)。

希望我的问题很清楚。 谢谢你尽你所能的帮助。

recursion方法是正确的,但是我不确定代码示例是非常有用的,如果你不知道recursion。 这是一个可行的解决scheme:

添加这些方法:

 - (id)findObjectWithKey:(id)key inArray:(NSArray *)array { for (id object in array) { if ([object isKindOfClass:[NSArray class]]) { return [self findObjectWithKey:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findObjectWithKey:key inDictionary:object]; } } return nil; } - (id)findObjectWithKey:(id)key inDictionary:(NSDictionary *)dict { for (id subKey in dict) { id object = [dict objectForKey:subKey]; if ([subKey isEqual:key]) { return object; } else if ([object isKindOfClass:[NSArray class]]) { return [self findObjectWithKey:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findObjectWithKey:key inDictionary:object]; } } return nil; } 

然后find你的对象,只要说:

 id object = [self findObjectForKey:@"title" inArray:array]; 

要修改方法来查找特定对象并返回字典密钥,请改为:

 - (id)findKeyWithObject:(id)key inArray:(NSArray *)array { for (id object in array) { if ([object isKindOfClass:[NSArray class]]) { return [self findKeyWithObject:key inArray:object]; } else if ([object isKindOfClass:[NSDictionary class]]) { return [self findKeyWithObject:key inDictionary:object]; } } return nil; } - (id)findKeyWithObject:(id)object inDictionary:(NSDictionary *)dict { for (id key in dict) { id subObject = [dict objectForKey:key]; if ([subObject isEqual:object]) { return key; } else if ([subObject isKindOfClass:[NSArray class]]) { return [self findKeyWithObject:object inArray:object]; } else if ([subObject isKindOfClass:[NSDictionary class]]) { return [self findKeyWithObject:object inDictionary:object]; } } return nil; } 

然后find你的钥匙,只要说:

 id key = [self findKeyWithObject:object inArray:array]; 

如何recursionsearch?

 - (void) searchRecursive :(NSArray *) array { NSEnumerator *e = [array objectEnumerator]; id obj; while ((obj = [e nextObject])) { if ([e isKindOfClass [NSArray class]]) [self searchRecursive :obj] else objobject ... forKey ... 

正如ott所说,一个recursion的方法将符合你的要求。 你还需要检查一个字典是否包含你想要的键(因为我猜你可能有不同types的字典表示的对象)。 也许你可以创build一个NSDictionary类来检查它是否在字典类types内匹配。

我的意思是:

 - (void)isType1 { return (([self objectForKey:@"title"] != nil) && [self objectForKey:@"id"] != nil) && ...); } 

我知道这可能会更“复杂”,但这可能是有用的。