首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Objective-C:遍历对象数组并删除与另一个数组中的值匹配的对象

Objective-C:遍历对象数组并删除与另一个数组中的值匹配的对象
EN

Stack Overflow用户
提问于 2018-09-13 03:50:04
回答 2查看 196关注 0票数 0

我有两个数组,一个包含一组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...%@")
            }
        }
    }

有没有人能给我指点一下我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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"

票数 3
EN

Stack Overflow用户

发布于 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...%@")
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52302434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档