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

Filter array using predicate based on another array that is key for predicate

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

<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
)

我想通过作为数组的键 occupantsIDs 来过滤数组。 我想创建匹配 occupantIDs 作为键的谓词。我想知道我可以用它来过滤数组吗?

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

任何答案都将不胜感激。

如果您使用:

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

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

如果您想排除那些也有其他 occupantID 的项目,请使用以下内容:

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 变成 "SUBQUERY(occupantIDs, $x, $x == 2285222)"。这等同于 "filter the array 'occupantIDs' by testing whether each element '$x' is equal to 2285222."(请注意,'$x' 是该元素的任意名称 - 它可以是 '$y' 或您喜欢的任何名称。)然后“.@count > 0”检查是否这个过滤后的数组有任何项目。换句话说,至少有一个 occupantID 匹配 2285222.

第二个 SUBQUERY 基本相同,但为 2285224。因此您可以将整个谓词解释为 "include those items where the occupantIDs array has any elements that match 2285222 AND any elements that match 2285224"。

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