Objective c NSPredicate在包含具有自定义对象的NSArray的NSArray中搜索
我有一个名为Objective c NSPredicate在包含具有自定义对象的NSArray的NSArray中搜索,objective-c,nsstring,nsarray,iteration,nspredicate,Objective C,Nsstring,Nsarray,Iteration,Nspredicate,我有一个名为groups的NSArray对象,其中包含NSArray对象,每个对象都包含QuestionSub对象,而这些对象又继承自Question类 问题类包括一个名为Id的NSString值。这是我要搜索的字符串。 问题是QuestionSub包含一个名为parent的NSString,它是对父问题的引用;因此,我不能将NSPredicate与ANY语句一起使用,因为它将匹配任何相等的字符串 我的问题是我的搜索没有返回结果。但是,我似乎无法为我的NSPredicate找到正确的查询以获得正
groups
的NSArray
对象,其中包含NSArray
对象,每个对象都包含QuestionSub
对象,而这些对象又继承自Question
类
问题类包括一个名为Id
的NSString
值。这是我要搜索的字符串。
问题是QuestionSub
包含一个名为parent
的NSString
,它是对父问题的引用;因此,我不能将NSPredicate
与ANY
语句一起使用,因为它将匹配任何相等的字符串
我的问题是我的搜索没有返回结果。但是,我似乎无法为我的NSPredicate
找到正确的查询以获得正确的结果
这是我的代码:
/**
* Get the (QuestionSub)[QuestionSub] for a questuon GUID
*
* @param guid NSString The GUID of the question
*
* @return QuestionSub The QuestionSub
*/
- (QuestionSub *)getQuestionForGuid:(NSString *)guid
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Id == %@", guid];
NSArray *filtered = [self.groups filteredArrayUsingPredicate:predicate];
if (filtered.count > 0)
{
return [filtered objectAtIndex:0];
}
else {
return nil;
}
}
这是我的NSArray
的表示:
看起来你可以使用字符串比较谓词,你能试试这个吗:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Id CONTAINS[c] %@", guid];
问题在于filteredArrayUsingPredicate:过滤整个组数组。所以,任何操作符都说要过滤掉所有包含具有所需Id属性的问题对象的子数组
在您的示例中,您在同一子数组中有相同Id和父级的问题,因此这里的ANY可以正常工作,并且对于我们的目标,==和CONTAINS之间没有区别
为了得到所需的结果,您首先需要将您的组扁平化为一维问题数组,然后应用谓词
不幸的是,NSArray类没有提供任何方法来展平多维数组(:做的事情与
any
相同,不尊重Id
,因此它在\u父级
和\u Id
上都匹配,这意味着过滤了
(谓词结果)有多个结果/行。请参见上面添加的图像,其中有示例数据。数组的内容是从JSON自动填充的,因此我没有一个示例,不幸的是……除了上面的内容之外。同样,没有这样的代码。数组的内容是从JSON结构自动填充的。当然,您可以用关于它缺乏足够的信息来诊断问题,但这是不真实的。有足够的信息,这是一个有充分证明的问题。此外,到目前为止,有两个答案可以表明这一点。我认为我们不应该把这变成一个长时间的讨论,我只是认为它对于一些样本数据是有用的。一个具有我用一些字典和相关的键组成数组。你可以用子查询做很多事情,但是如果没有任何样本数据,就很难处理-除非你想让回答者也为你构建测试数据集。顺便说一句,你读过了吗?我要的是一个可编译的示例,这样我们都知道我们要完成什么。好的,我明白了d、 鉴于上图所示为阵列,实际问题的示例代码已包含在内,问题并不特定于我的NSArray
,并且存在解释;我觉得我已经完成了这些目标。是的,我已经阅读了MCVE(和其他规则)而且,关于上面的图像,它符合可验证类别。但是,我非常感谢您的关注以及您为提高SO的帖子质量所做的努力。谢谢。我很担心。我现在通过for
循环解决了这个问题,该循环在组中的每个子NSArray
上应用NSPredicate
数组。这样做有点冒险,但考虑到数组包含的组数不会超过前5-10组,我愿意冒险。谢谢。