2015-02-06 4 views
1

Привет всем, это может быть глупым вопросом и может быть задан раньше, я хочу, чтобы фильтр массива использовал предикат. У меня есть массив, который содержит словарь такого же типа, как и следующий.Фильтровать массив с использованием предиката на основе другого массива, который является ключом для предиката

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

Я хочу отфильтровать массив с помощью идентификаторов ключевых лиц, которые являются массивами. Я хочу создать предикат, который будет соответствовать идентификаторам-пассажирам в качестве ключа. Я хочу знать, могу ли я использовать это для фильтрации массива.

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

Любой ответ можно оценить.

+0

Вы можете уточнить: сделайте вы хотите включить комнаты, где: a) любой пассажир соответствует либо 2285222, либо 2285224, либо b) оба 2285222 и 2285224 были жильцами? И вы хотите включить комнаты, в которых также есть другие пассажирские идентификаторы в дополнение к этим двум? – pbasdf

+0

OccupantsIDs известны, так что это только они, и я хочу фильтровать в соответствии с этим. Если мы сможем получить результат от использования одного из них, то это также хорошо для моего случая, но я предлагаю лучше использовать оба для сравнения. – jogshardik

ответ

1

Если вы используете:

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

это будет соответствовать всем деталям, где occupantIDs массива включает в себя как 2285222 и 2285224 (и может также включать другой occupantIDs).

Если вы хотите, чтобы исключить те пункты, которые также имеют другие occupantIDs, используйте следующее:

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

Чтобы объяснить, как они работают: во-первых, каждый% @ заменяется на соответствующий пункт из списка аргументов (@ 2285222 и т. Д.). Таким образом, первый SUBQUERY становится «SUBQUERY (userantIDs, $ x, $ x == 2285222)». Это эквивалентно «фильтровать« идентификаторы пассажиров »массива, проверяя, равен ли каждый элемент« $ x »2285222.» (Обратите внимание, что «$ x» - произвольное имя для элемента - это может быть «$ y» или что угодно.) Затем «. @ Count> 0» проверяет, есть ли в этом фильтрованном массиве какие-либо элементы. Иными словами, по крайней мере один идентификатор занятого человека совпадает с 2285222.

Второй СУБКЕРИЙ в основном такой же, но для 2285224. Таким образом, вы можете интерпретировать общий предикат как «включать те элементы, в которых массив userantID имеет любые элементы, которые соответствуют 2285222 И любые элементы, которые соответствуют 2285224 ».

Чтобы исключить элементы, которые также имеют другие occupantIDs, я добавил еще один пункт, который использует ту же технику, чтобы включить только те пункты, где массив occupantIDs не имеет элементов, которые не соответствуют 2285222 или 2285224.

+0

Спасибо за ваши усилия. Ваше решение работает для меня, но можете ли вы кратко рассказать мне, как это будет сравниваться? – jogshardik

+0

Я объясню в своем ответе. – pbasdf

+0

Большое спасибо за ваши усилия. – jogshardik

Смежные вопросы