Objective-C: 减少 NSArray 中的属性

Objective-C: Reduce properties in NSArray

我有两个相似但不同的对象数组,我想合并它们。这些对象有一些共同的属性和一些我并不特别需要的独特属性。所以我的想法是将它们简化为它们共有的属性。

我的问题是我还没有找到去除数组中对象属性的方法。我想它可能有一个谓词或键值,但是,我还没有找到一种方法。属性是异构的,即字符串、NSDates 和 Bools。数组中有多个对象具有这些属性的值。

示例:

NSArray1

id (NSNuber)|title (NSString)|color(NSString)

NSArray2
id (NSNumber)|title (NSString)|length(NSNumber)

我如何从 NSArray1 中去除颜色并从 NSArray2 中去除长度以获得两个具有 id|title

的数组

这个问题有点模棱两可,因为它没有指出数组中对象的类型,但我们假设它们是字典。

无需删除属性,因为在构建结果数组时,您将放弃两个源对象(支持可变副本)...

NSArray *array1, *array2;  // these are initialized with the dictionaries
NSMutableArray *result = [NSMutableArray array];
for (NSDictionary *d1 in array1) {
    NSDictionary *d2 = [self elementMatching:d1 in:array2];
    if (!d2) {
        // what should we do if there's no match?
        // maybe ignore, maybe just add it to result?
    } else {
        // here, d2 has id, title, length.  needs color from d1
        NSMutableDictionary *newD2 = [d2 mutableCopy];
        newD2[@"color"] = d1[@"color"];
        [result addObject:newD2];
    }
}

- (NSDictionary *)elementMatching:(NSDictionary *)d in:(NSArray *)array {
    for (NSDictionary *element in array) {
        if ([element[@"id"] isEqual:element[@"id"]] && [element[@"title"] isEqual:element[@"title"]]) 
            return element;
    }
    return nil;
}

请注意,此循环考虑了 array2 中没有与 array1 中找到的对象相匹配的对象的情况。您应该根据您的要求决定在那里做什么。它也不考虑 array2 的元素在 array1 中没有对应物的情况。您将需要另一个(类似的)循环来处理这些问题。