2011-12-20 9 views
10

私はMMPlaceオブジェクトというNSArrayを持つMMPlaceというオブジェクトのNSArrayを持っています。ユニット化されたNSArray

MMPlaceオブジェクトの配列に含まれるすべてのMMProductオブジェクトの結合NSArrayを取得するにはどうすればよいですか?この特定の例は機能しませんが、NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"];のようなものがいいでしょう。

答えて

3

NSMutableArrayを作成し、元の配列をループし、各サブアレイにaddObjectsFromArray:を呼び出します。

+0

おかげで、それは私が回避しようとしている正確に何が私のため – Eugene

2

私は何が必要ない既製の方法があると思いませんが、簡単に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 
+0

を働きました。本当の選択はないと思います。 :( – Eugene

+0

'NSArray'のカテゴリに実装を追加し、簡単な方法の後ろに視界から隠すことができます。 – dasblinkenlight

0

ここではどのようなツリー構造でも機能する「平坦化」カテゴリメソッドを実装しました。それは任意の深さのツリーをとり、それを1つの長い配列に順番にマージします。

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

上記で説明したケースを処理する便利なカテゴリメソッドを記述することができます。このラッパーメソッドは、nd配列を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

あなたは@unionOfArraysでこれを行うことができます。あなたが欠落していたビットは、配列を直接ネストされているので、コレクション演算子の右側のキーはselfでなければならないとされています

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