联合arrays的NSArray

我有一个名为MMPlace的对象的NSArray,它具有MMProduct对象的NSArray。

我如何获得我的MMPlace对象数组包含的所有MMProduct对象的联合NSArray? 就像NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"]; 会很好,虽然这个具体的例子不起作用。

创build一个NSMutableArray,遍历原始数组,并调用addObjectsFromArray:与每个子数组。

你可以用@unionOfArrays做到这@unionOfArrays 。 你所缺less的是,因为数组是直接嵌套的,集合运算符右边的键必须是self

 NSArray *nestedValues = @[@[@1, @2, @3], @[@4, @5, @6]] NSArray *flattenedValues = [nestedValues valueForKeyPath:@"@unionOfArrays.self"]; // flattenedValues contains @[@1, @2, @3, @4, @5, @6] 

我不认为有一个现成的方法可以满足你的需要,但是你可以很容易地将你的数组“扁平化”在for循环中,并将该方法隐藏在一个类别中:

编辑:添加一个类别。

 @interface NSArray (flatten) -(NSArray*) flattenArray; @end @implementation NSArray (flatten) -(NSArray*) flattenArray { // If inner array has N objects on average, multiply count by N NSMutableArray *res = [NSMutableArray arrayWithCapacity:self.count]; for (NSArray *element in self) { [res addObjectsFromArray:element]; } return res; } @end 

这里是我如何实现一个“扁平”类别的方法,将在任何树结构工作。 它将采取一个任意深度的树,并按顺序将它合并成一个长arrays。

 - (NSArray *) flattenWithBlock:(NSArray *(^)(id obj))block { NSMutableArray *newItems = [NSMutableArray array]; for(id subObject in self) { if([subObject isKindOfClass:[NSArray class]]) { [newItems addObjectsFromArray:[subObject flatten:block]]; } else [newItems addObject:subObject]; } return newItems; } 

然后你可以编写一个方便的类别方法来处理你上面描述的情况。 这个包装方法会将第二个数组变成1d数组。

 - (NSArray *) flattenArray { NSArray *newItems = [self flattenWithBlock:^NSArray *(id obj) { return obj; }]; return newItems; } 
 @interface NSArray (Flatten) -(NSArray*)flattenedArray; @end @implementation NSArray (Flatten) -(NSArray*)flattenedArray { NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count]; for (id thing in self) { if ([thing isKindOfClass:[NSArray class]]) { [result addObjectsFromArray:[(NSArray*)thing flattenedArray]]; } else { [result addObject:thing]; } } return [NSArray arrayWithArray:result]; } @end