/ / NSPredicate "OR" filtrowanie oparte na NSArray kluczy - cel-c, nsarray, nspredicate, foundation

NSPredicate "OR" filtrowanie oparte na NSArray kluczy - cel-c, nsarray, nspredicate, foundation

Rozważ następujące NSArray:

NSArray *dataSet = [[NSArray alloc] initWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:@"abc", @"key1", @"def", @"key2", @"hij", @"key3", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"klm", @"key1", @"nop", @"key2", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"qrs", @"key2", @"tuv", @"key4", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"wxy", @"key3", nil],
nil];

Jestem w stanie filtrować tę tablicę, aby znaleźć obiekty słownika, które zawierają klawisz key1

// Filter our dataSet to only contain dictionary objects with a key of "key1"
NSString *key = @"key1";
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys", key];
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
NSLog(@"filteretSet1: %@",filteretSet1);

Który odpowiednio zwraca:

filteretSet1: (
{
key1 = abc;
key2 = def;
key3 = hij;
},
{
key1 = klm;
key2 = nop;
}
)

Teraz chcę filtrować zestaw danych dla obiektów zawierających słownik KAŻDY kluczy w NSArray.

Na przykład, używając tablicy: NSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil]; Chcę utworzyć predykat, który zwraca i tablicy każdy obiekty słownika zawierające "klucz1" lub "key3" (tj. w tym przykładzie wszystkie obiekty słownika zostaną zwrócone z wyjątkiem trzeciego obiektu - ponieważ nie zawiera ani "klucza1" lub "key3").

Jakieś pomysły na to, jak to osiągnąć? Czy musiałbym użyć predykatu złożonego?

Odpowiedzi:

9 dla odpowiedzi № 1

The ANY operator NSPredicate obejmuje to:

NSSet *keys = [NSSet setWithObjects:@"key1", @"key3", nil];

NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"any self.@allKeys in %@", keys];

1 dla odpowiedzi nr 2

Zrób to:

   NSString *key = @"key1";
NSString *key1 = @"key3";
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys OR %@ IN self.@allKeys",key,key1];
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
NSLog(@"filteretSet1: %@",filteretSet1);

Działa idealnie dla mnie. Nadzieja Przydatna


1 dla odpowiedzi nr 3

Mimo odpowiedzi na pytanie, możesz również użyć bloku, aby uzyskać większą szczegółowość:

NSArray *filter = [NSArray arrayWithObjects:@"key1", @"key3",nil];

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){
NSDictionary *data = (NSDictionary*)obj;

// use "filter" and implement your logic and return YES or NO
}];

[dataSet filteredArrayUsingPredicate:filterBlock];

Mogło to zostać zmienione tak, jak chcesz, być może w ramach własnej metody.