0

我扁平化包含数组的 NSArray 的典型模式如下:

NSMutableArray *flattenedArray = [NSMutableArray array];
for (NSArray *innerObjects in arrayToFlatten) {
    [flattenedArray addObjectsFromArray:innerObjects];
}

(或者我会使用 @unionOfArrays KVC 集合运算符)。

使用 RXCollections 的最佳等价物是什么?我有:

NSArray *flattenedArray = RXConstructArray(RXFold(arrayToFlatten, [NSMutableArray array], ^id(id memo, id each,
    bool *stop) {
    NSMutableArray *accumulator = memo;
    [accumulator addObjectsFromArray:each];
    return accumulator;
}));

但是 NSMutableArray 累加器的使用对我来说很不协调。


我保留了上面的原件,以免对 Rob 的回答胡说八道,但(迄今为止)改进的版本是:

NSArray *flattenedArray = RXFold(arrayToFlatten, [NSMutableArray array], ^id(NSMutableArray *accumulator, NSArray *array,
    bool *stop) {
    [accumulator addObjectsFromArray:array];
    return accumulator;
});
4

1 回答 1

2

当使用这个或任何其他抽象时,我发现它有助于我思考流程的结构。从语义上讲,将数组数组展平为单个数组是折叠;所以这段代码非常直接地实现了这一点。(旁白:你知道你可以只输入备忘录NSMutableArray *而不是id,而不是做那个临时任务吗?获胜的协方差!)

另一方面,如果您更关心按顺序遍历嵌套数组中的对象而不是结果数组,那么您真正想要的是由每个包含数组的遍历组成的遍历。

您可以在那时将其折叠成一个数组RXConstructArray(),但是如果您不需要生成最终的数组值,那么您将有一个纯粹的惰性过程。

关于此的两个注意事项:

  1. RXConstructArray()返回一个延迟填充的数组,类似于 Core Data fetches 如何使用fetchBatchSizeset。

  2. 您的使用RXFold()实际上并不需要RXConstructArray(),因为它返回的是由其对块的最终评估产生的备忘录,而不是遍历。在技​​术细节上,这是因为RXFold()评估严格,而不是懒惰;不过,ObjC 中的惰性折叠功能听起来是个有趣的项目!

于 2013-10-10T14:45:04.293 回答