2009-06-22 62 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