什么是JS的`map()`函数的Objective-C等价物?

时间:2011-01-19 22:57:11

标签: javascript objective-c porting

什么是JS的map()函数的Objective-C等价物?我会使用NSFastEnumeration并自己应用该功能吗?

5 个答案:

答案 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,它将地图和其他类似功能添加到NSArrayNSSet。)

答案 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;
}