我有两个数组,一个包含一组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
并检查是否有任何对象具有出现在identifierArray
中的ID。如果找到匹配项,则应从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...%@")
}
}
}
有没有人能给我指点一下我该怎么做呢?
发布于 2018-09-13 04:22:35
我的建议是放弃循环,使用更现代的基于块的indexesOfObjectsPassingTest
(它实际上从2009年起就存在于macOS 10.6、雪豹和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.4Tiger和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"
发布于 2018-09-13 04:06:33
在这种情况下,您很可能不能使用==来比较这两个对象,而应该使用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...%@")
}
}
}
https://stackoverflow.com/questions/52302434
复制相似问题