2009-06-22 64 views
6

比方说,我有一个NSArrayNSDictionaries这是10个元素长。我想创建第二个NSArray与每个字典上的单个键的值。我可以计算要做到这一点,最好的办法是:从现有NSArray创建新NSArray的标准约定是什么?

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]结合计数器,因为新的名单应该是完全与旧名单一样长。请注意,我不是要过滤原始数组的一个子集,而是使用完全相同数量的元素创建一个新数组,只需使用数组中每个元素的某个任意属性挖掘的值。

在蟒蛇人能解决这个问题是这样的:

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

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

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

具有要在Objective-C稍微更明确的让我想知道是否有一种公认的处理这些情况的方法。

回答

11

在这种特定的情况下可可不简洁:)

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

胜过从NSArray的文档:

valueForKey:

返回包含 结果的阵列调用valueForKey:在每个接收者的对象上使用 键。

+1

这就是霍特,谢谢! – Prairiedogg 2009-06-22 10:07:09