私はMMPlaceオブジェクトというNSArrayを持つMMPlaceというオブジェクトのNSArrayを持っています。ユニット化されたNSArray
MMPlaceオブジェクトの配列に含まれるすべてのMMProductオブジェクトの結合NSArrayを取得するにはどうすればよいですか?この特定の例は機能しませんが、NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"];
のようなものがいいでしょう。
私はMMPlaceオブジェクトというNSArrayを持つMMPlaceというオブジェクトのNSArrayを持っています。ユニット化されたNSArray
MMPlaceオブジェクトの配列に含まれるすべてのMMProductオブジェクトの結合NSArrayを取得するにはどうすればよいですか?この特定の例は機能しませんが、NSArray *arr = [array valueForKeyPath:@"@unionOfObjects.products"];
のようなものがいいでしょう。
NSMutableArrayを作成し、元の配列をループし、各サブアレイにaddObjectsFromArray:
を呼び出します。
私は何が必要ない既製の方法があると思いませんが、簡単に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
を働きました。本当の選択はないと思います。 :( – Eugene
'NSArray'のカテゴリに実装を追加し、簡単な方法の後ろに視界から隠すことができます。 – dasblinkenlight
ここではどのようなツリー構造でも機能する「平坦化」カテゴリメソッドを実装しました。それは任意の深さのツリーをとり、それを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;
}
@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
あなたは@unionOfArrays
でこれを行うことができます。あなたが欠落していたビットは、配列を直接ネストされているので、コレクション演算子の右側のキーはself
でなければならないとされています
NSArray *nestedValues = @[@[@1, @2, @3], @[@4, @5, @6]]
NSArray *flattenedValues = [nestedValues valueForKeyPath:@"@unionOfArrays.self"];
// flattenedValues contains @[@1, @2, @3, @4, @5, @6]
おかげで、それは私が回避しようとしている正確に何が私のため – Eugene