2011-12-20 30 views
10

Tôi có một NSArray của các đối tượng được gọi là MMPlace, trong đó có NSArray của các đối tượng MMProduct.NSArray của mảng hợp nhất

Làm cách nào để có được một NSArray hợp nhất của tất cả các đối tượng MMProduct mà đối tượng mảng MMPlace của tôi chứa? Một cái gì đó như NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"]; sẽ là tốt đẹp, mặc dù ví dụ cụ thể này không hoạt động.

Trả lời

3

Tạo NSMutableArray, lặp qua mảng ban đầu của bạn và gọi addObjectsFromArray: với từng mảng con.

+0

Cảm ơn, nó làm việc cho tôi – Eugene

2

Tôi không nghĩ rằng có một phương pháp off-the-shelf mà những gì bạn cần, nhưng bạn có thể dễ dàng "làm phẳng" mảng của bạn trong một vòng lặp for, và ẩn các phương pháp trong một thể loại:

Chỉnh sửa: đã thêm danh mục.

@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 
+0

Đó chính xác là những gì tôi đang cố gắng để trốn tránh. Đoán không có sự lựa chọn thực sự. :( – Eugene

+0

Bạn có thể thêm một triển khai vào một danh mục 'NSArray' và ẩn nó khỏi tầm nhìn của bạn đằng sau một phương pháp nhỏ đẹp. – dasblinkenlight

0

Dưới đây là cách tôi triển khai phương pháp danh mục "phẳng" sẽ hoạt động trên bất kỳ cấu trúc cây nào. Nó sẽ lấy một cây có chiều sâu tùy ý và hợp nhất nó thành một mảng dài theo thứ tự.

- (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; 
} 

Sau đó, bạn có thể viết phương pháp phân loại tiện lợi xử lý trường hợp bạn đã mô tả ở trên. Phương thức trình bao bọc này sẽ làm phẳng mảng thứ hai thành mảng 1d.

- (NSArray *) flattenArray { 
    NSArray *newItems = [self flattenWithBlock:^NSArray *(id obj) { 
     return obj; 
    }]; 

    return newItems; 
} 
0
@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 
41

Bạn có thể làm điều này với @unionOfArrays. Bit bạn bị mất tích là vì các mảng được lồng trực tiếp, phím trên bên phải của các nhà điều hành bộ sưu tập phải self:

NSArray *nestedValues = @[@[@1, @2, @3], @[@4, @5, @6]] 
NSArray *flattenedValues = [nestedValues valueForKeyPath:@"@unionOfArrays.self"]; 
// flattenedValues contains @[@1, @2, @3, @4, @5, @6] 
Các vấn đề liên quan