Objective-C:在对象数组中循环并删除与另一个数组中的值匹配的对象

时间:2018-09-12 19:50:04

标签: objective-c arrays xcode for-loop

我有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...%@")
            }
        }
    }

有人可以指出我的方向吗?

2 个答案:

答案 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...%@")
        }
    }
}