大家好,这可能是个愚蠢的问题,之前可能有人问过,我想使用谓词过滤数组。我有一个数组,其中包含如下相同类型的字典。
<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)”。这相当于“通过测试每个元素‘$x’是否等于 2285222 来过滤数组‘occupantIDs’”。 (请注意,'$x' 是该元素的任意名称 - 它可以是 '$y' 或您喜欢的任何名称。)“.@count > 0” 然后检查这个过滤后的数组是否有任何项目。换句话说,至少有一个 occupantID 匹配 2285222。
第二个 SUBQUERY 基本相同,但针对的是 2285224。因此您可以将整个谓词解释为“包括 occupantIDs 数组中包含与 2285222 匹配的任何元素以及与 2285224 匹配的任何元素的那些项目”。
为了排除也有其他 occupantID 的项目,我添加了另一个子句,该子句使用相同的技术仅包括 occupantIDs 数组中没有与 2285222 或 2285224 不匹配的项目的项目。
关于ios - 使用基于谓词键的另一个数组的谓词过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370964/