我有2个数组,一个包含一组ID,一个包含一组对象(类似于以下内容):
NSArray *identifierArray = @[@100, @200, @300];
NSArray *peopleArray = @[@{@"id": @100, @"name": @"Ben"}, @{@"id": @200, @"name": @"Alex"}, @{@"id": @300, @"name": @"Sarah"}, @{@"id": @400,@"name": @"George"}, @{@"id": @500, @"name": @"Jessica"}];
我希望能够遍历peopleArray
并检查是否有任何对象的ID出现在identifierArray
中。如果找到匹配项,则应从identifierArray
中删除该对象,这将导致:
NSArray *peopleArray = @[@{@"id": @400,@"name": @"George"}, @{@"id": @500, @"name": @"Jessica"}];
我尝试了一些for循环,以循环遍历每个对象,然后循环遍历peopleArray
中的每个ID,如下所示,但是它不会删除任何对象,即使应该包含对象删除。
for (NSNumber *id in activePeople) {
for (int i = 0; i < peopleArray.count; i++) {
if (id == [peopleArray[i] valueForKey:@"id"]) {
NSLog(@"Should remove...%@")
}
}
}
有人可以指出我的方向吗?
答案 0 :(得分:3)
我的建议是丢弃循环,并使用更现代的基于块的API indexesOfObjectsPassingTest
(自2009年以来,它们在macOS 10.6 Snow Leopard和iOS 4.0中实际上已经存在)。
NSArray *identifierArray = @[@100, @200, @300];
NSMutableArray *array = [@[@{@"id": @100, @"name": @"Ben"}, @{@"id": @200, @"name": @"Alex"}, @{@"id": @300, @"name": @"Sarah"}, @{@"id": @400,@"name": @"George"}, @{@"id": @500, @"name": @"Jessica"}] mutableCopy];
NSIndexSet *indexes = [array indexesOfObjectsPassingTest:^BOOL(NSDictionary *obj, NSUInteger idx, BOOL *stop) {
return [identifierArray containsObject:obj[@"id"]];
}];
[array removeObjectsAtIndexes:indexes];
NSLog(@"%@", array);
或者更有效地使用谓词过滤数组(自2005年起使用macOS 10.4 Tiger和iOS 3.0(!))
NSArray *identifierArray = @[@100, @200, @300];
NSArray *array = @[@{@"id": @100, @"name": @"Ben"}, @{@"id": @200, @"name": @"Alex"}, @{@"id": @300, @"name": @"Sarah"}, @{@"id": @400,@"name": @"George"}, @{@"id": @500, @"name": @"Jessica"}];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT id IN %@", identifierArray];
NSArray *result = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", result);
如果id
的值应该是字符串,请用@x00
替换所有出现的@"x00"
答案 1 :(得分:1)
在这种情况下,您很可能无法使用==比较两个对象,而是使用isEqual:
==比较指针的值。在您的情况下,它们似乎会不同。
isEqual:而是比较对象本身。
要重复使用代码,您可以尝试以下操作:
for (NSNumber *id in activePeople) {
for (int i = 0; i < peopleArray.count; i++) {
if ([id isEqual:[peopleArray[i] valueForKey:@"id"]) {
NSLog(@"Should remove...%@")
}
}
}