使用谓词基于另一个作为谓词键的数组来过滤数组

时间:2015-02-06 17:04:08

标签: ios iphone arrays xcode nsmutablearray

大家好,这可能是个愚蠢的问题,之前可能会被问到,我想用谓词过滤数组。我有一个数组,其中包含相同类型的字典,如下所示。

<NSArrayM>(
ID:54d3ca82535c12243400c254                      
Room JID:(null)                      
name:(null)                      
photo:(null)                      
type:3                      
lastMessage:Gand                      
lastMessageDate:2015-02-05 20:02:47 +0000                      
occupantIDs:(
2285222,
2285224
)                      
userID:2285224                      
unreadMessagesCount:4                      
lastMessageUserID:2285224
)

我想通过密钥占用ID(即数组)过滤数组。 我想创建匹配使用者ID作为键的谓词。我想知道我可以使用它来过滤数组。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"occupantIDs = @[2285222,2285224]"];        
NSArray *filterArray = [dialogs filteredArrayUsingPredicate:predicate];

任何答案都可以理解。

1 个答案:

答案 0 :(得分:1)

如果您使用:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x == %@).@count > 0", @2285222,@2285224];

这将匹配occupantIDs数组包含2285222和2285224(并且还可能包含其他占用ID)的任何项目。

如果要排除那些也有其他占用ID的项目,请使用以下命令:

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x == %@).@count > 0 AND SUBQUERY(occupantIDs, $x, $x != %@ AND $x != %@).@count = 0", @2285222,@2285224,@2285222,@2285224];

解释这些是如何工作的:首先,每个%@被参数列表中的相应项(@ 2285222等)替换。因此,第一个SUBQUERY成为&#34; SUBQUERY(占用ID,$ x,$ x == 2285222)&#34;。这相当于&#34;过滤数组&#39; occupantIDs&#39;通过测试每个元素&#39; $ x&#39;等于2285222。&#34; (请注意,&#39; $ x&#39;是元素的任意名称 - 它可以是&#39; $ y&#39;或者您喜欢的任何名称。)&#34;。@ count&gt; 0&#34;然后检查此过滤后的数组是否包含任何项目。换句话说,至少有一个占用者ID匹配2285222。

第二个SUBQUERY基本相同,但是对于2285224.所以你可以将整个谓词解释为&#34;包括那些占用ID数组有任何匹配2285222的元素和任何匹配2285224&#34;的元素的项目。

为了排除还有其他占用ID的项目,我添加了另一个使用相同技术的子句,仅包含那些占用ID数组中没有与2285222或2285224不匹配的项目的项目。