什么是JS的map()
函数的Objective-C等价物?我会使用NSFastEnumeration并自己应用该功能吗?
答案 0 :(得分:34)
如果您使用的是OS X 10.6或iOS 4,则可以使用NSArray
的{{3}}。
NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id mapObj = DoSomethingToObject(obj);
[mapped addObject:mapObj];
}];
(无耻但相关的插件:我有一个enumerateObjectsUsingBlock:
用于OS X和iOS,它将地图和其他类似功能添加到NSArray
和NSSet
。)
答案 1 :(得分:12)
这取决于。如果你有一个对象数组,并且这些对象具有URL
属性(例如),那么你可以这样做:
NSArray * urls = [myArray valueForKey:@"URL"];
同样,如果您可以通过一条带有0或1个参数的消息触发相关对象的行为,您可以这样做:
[myArray makeObjectsPerformSelector:@selector(doFoo)];
//or:
[myArray makeObjectsPerformSelector:@selector(doFooWithBar:) withObject:aBar];
除此之外,你必须自己迭代这些对象。您可以使用for()
循环,for(in)
循环或类似-enumerateObjectsUsingBlock:
等内容。
答案 2 :(得分:9)
你自己做。没有一种方法等同于你想要的。
编辑:对于那些downvoting,这是当时(三年前)的正确答案,仍然是Objective-C,但Swift确实有map()
函数。 / p>
答案 3 :(得分:4)
检查BlocksKit,它为NSArray提供map,reduce和filer。
- (NSArray *)map:(BKTransformBlock)block;
- (id)reduce:(id)initial withBlock:(BKAccumulationBlock)block;
- (NSArray *)select:(BKValidationBlock)block;
答案 4 :(得分:1)
NSArray的类别功能替代
- (NSArray *)map:(id(^)(id, BOOL *))block {
NSMutableArray * array = [NSMutableArray array];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id newObject = block(obj,stop);
if (newObject == nil) {
newObject = [NSNull null];
}
[array addObject:newObject];
}];
return array.copy;
}
NSMutableArray 的类别函数
- (NSMutableArray *)map:(id(^)(id))block {
NSEnumerator * enumerator = ((NSArray *)self.copy).objectEnumerator;
id obj; NSUInteger idx = 0;
while ((obj = enumerator.nextObject)) {
self[idx] = block(obj) ?: [NSNull null];
idx++;
}
return self;
}