Một câu trả lời thay thế sử dụng đệ quy, trong đó sẽ mất nhiều bộ nhớ hơn (trên stack), nhưng đối với những người thích đệ quy, là đơn giản để đọc:
- (NSArray *) flatten;
{
NSMutableArray *flattedArray = [NSMutableArray new];
for (id item in self) {
if ([[item class] isSubclassOfClass:[NSArray class]]) {
[flattedArray addObjectsFromArray:[item flatten]];
} else {
[flattedArray addObject:item];
}
}
return flattedArray;
}
Và mở rộng các cuộc thử nghiệm:
+ (void) unitTests;
{
NSArray *flattenedArray;
NSArray *initialArray1 = @[@[@23, @354, @1, @[@7], @[@[@3]]], @[@[@890], @2, @[@[@6], @8]]];
NSArray *expectedArray1 = @[@23, @354, @1, @7, @3, @890, @2, @6, @8];
flattenedArray = [initialArray1 flatten];
SPASLogDetail(@"flattenedArray: %@", flattenedArray);
AssertIf(![flattenedArray isEqualToArray:expectedArray1], @"Arrays are not equal");
NSArray *initialArray2 = @[@[@23, @354, @1, [@[@7] mutableCopy], @[@[@3]]], @[[@[@890] mutableCopy], @2, @[@[@6], @8]]];
NSArray *expectedArray2 = expectedArray1;
flattenedArray = [initialArray2 flatten];
SPASLogDetail(@"flattenedArray: %@", flattenedArray);
AssertIf(![flattenedArray isEqualToArray:expectedArray2], @"Arrays are not equal");
}
Nguồn
2015-04-09 20:47:49
+1 cho cả câu hỏi và câu trả lời, giải pháp thanh lịch. –