2011-12-20 10 views
10

Tengo un NSArray de objetos llamado MMPlace, que tiene objetos NSArray de MMProduct.NSArray of united Arrays

¿Cómo obtengo un NSArray unido de todos los objetos MMProduct que contiene mi objeto Array of MMPlace? Algo como NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"]; sería bueno, aunque este ejemplo específico no funciona.

Respuesta

3

Crea un NSMutableArray, recorre tu matriz original y llama al addObjectsFromArray: con cada subcampo.

+0

Gracias, funcionó para mí – Eugene

2

No creo que hay un método off-the-shelf que hace lo que necesita, pero fácilmente puede "aplanar" la matriz en un bucle for, y ocultar el método en la categoria:

Editar: agregó una categoría.

@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

eso es exactamente lo que estoy tratando de evadir. Supongo que no hay elección real. :( – Eugene

+0

Puede agregar una implementación a una categoría de 'NSArray', y ocultarla de su vista detrás de un pequeño y agradable método. – dasblinkenlight

0

Así es como implementé un método de categoría "aplanar" que funcionará en cualquier estructura de árbol. Tomará un árbol de profundidad arbitraria y lo fusionará en una larga matriz en orden.

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

A continuación, puede escribir un método de categoría de conveniencia que maneje el caso que describió anteriormente. Este método de envoltura aplanará una matriz nd en una matriz 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

Usted puede hacer esto con @unionOfArrays. El bit que faltaban es que debido a que las matrices están anidados directamente, la tecla a la derecha de la empresa de recogida debe ser self:

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