代码之家  ›  专栏  ›  技术社区  ›  2snacc

从现有的NSARRAY创建新的NSARRAY的标准惯例是什么?

  •  6
  • 2snacc  · 技术社区  · 17 年前

    假设我有一个 NSArray 属于 NSDictionaries 这是10个元素的长度。我想再创造一秒钟 不可变数组 每个字典上的单个键的值。我能想到的最好的方法是:

        NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
        for (NSDictionary *p in array) {
            [nameArray addObject:[p objectForKey:@"name"]];
        }
        self.my_new_array = array;
        [array release];
        [nameArray release];
    }
    

    但从理论上讲,我应该能够避免使用可变数组和计数器 [nameArray addObjectAtIndex:count] ,因为新列表的长度应与旧列表的长度完全相同。请注意,我不是要过滤原始数组的子集,而是创建一个元素数量完全相同的新数组,只是从数组中每个元素的某个任意属性中提取值。

    在python中,可以这样解决这个问题:

    new_list = [p['name'] for p in old_list]
    

    或者如果你是个受虐狂,像这样:

    new_list = map(lambda p: p['name'], old_list)
    

    在Objective-C中必须稍微明确一点,这让我怀疑是否有一种公认的处理这些情况的通用方法。

    1 回复  |  直到 10 年前
        1
  •  11
  •   monowerker    17 年前

    在这种特殊的情况下,可可在简洁性上并不突出:)

    NSArray *newArray = [array valueForKey:@"name"];
    

    根据NSARRAY文件:

    价值:

    返回包含 调用valueforkey的结果:使用 键入每个接收器的对象。