大家好,这可能是个愚蠢的问题,之前可能会被问到,我想用谓词过滤数组。我有一个数组,其中包含相同类型的字典,如下所示。
<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];
任何答案都可以理解。
答案 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不匹配的项目的项目。