2013-04-05 11 views
9

Ho un NSArray con NSDictionaries. Una delle chiavi dei dizionari in uno degli array contiene un valore. Voglio recuperare lo NSDictionary con quel valore.Recupera NSDictionary da NSArray dove la chiave del dizionario ha valore X

La mia matrice:

Array: (
     { 
     DisplayName = "level"; 
     InternalName = "Number 2"; 
     NumberValue = 1; 
    }, 
     { 
     DisplayName = "PurchaseAmount"; 
     InternalName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 

Quindi, vorrei ottenere il dizionario che contiene DisplayName insieme a PurchaseAmount (case insensitive).

Come posso farlo?

+3

Si dovrebbe essere in grado di utilizzare 'NSPredicate' per questo. [Vedi esempio simile qui] (http://stackoverflow.com/q/958622/119114). – Nate

+0

Thnx per il suggerimento. Aggiungerò la soluzione che ho usato per la risposta –

risposta

17

Il seguente risolto il mio problema:

NSArray *filtered = [promotions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName == %@)", @"PurchaseAmount"]]; 
NSDictionary *item = [filtered objectAtIndex:0]; 

Thnx a utente Nate per il suo commento sulla mia domanda!

+3

In realtà, sia questa risposta, sia [specialmente la risposta di Lindinx] (http://stackoverflow.com/a/15831638/119114) sono migliori di quelle che hai accettato. La risposta di Bhargavi verifica che una chiave * contenga * la stringa, ma la tua domanda ha chiesto un risultato con una chiave uguale a un certo valore. In generale, quei due non sono la stessa cosa. Potrebbe non fare la differenza per i tuoi nomi chiave, ma per altri potrebbe farlo molto bene. – Nate

+0

Stai rispondendo alla tua domanda sbagliata quando hai chiesto "case insensitive". Specialmente come lo hai impostato come accettato. – lindinax

5

Usa NSPredicate questo modo

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName LIKE[cd] 'PurchaseAmount' "]; 
NSArray *filter = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",filter); 

Qui filtro tenere le dizionari che contiene DisplayName impostato PurchaseAmount (case insensitive)

+0

Bello! Grazie. Meglio della mia soluzione appena trovata. –

+0

In realtà, questo è ** non ** ciò che la domanda ha posto. Il tuo predicato trova corrispondenze in cui la chiave ** contiene ** la stringa. Se c'è un'altra chiave che è un superset di questo nome di chiave, il tuo filtro fornisce un * falso positivo *. (ad es. 'DisplayName =" PurchaseAmountWithTax "';) – Nate

+0

Hai ragione, anche se la soluzione di Bhargavi è sicuramente utile! –

9

COME [cd] sarà anche farlo

NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName LIKE[cd] %@)", @"purchaseAmount"]]; 

restituito

<NSArray>(
    { 
     DisplayName = PurchaseAmount; 
     InternaName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 
0
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName == 'level'"]; 
    NSArray *arrOutput = [[Array filteredArrayUsingPredicate:predicate] mutableCopy]; 

con l'aiuto di cui sopra 2 linee avrete tutte dizionario con DisplayName = "PurchaseAmount"

3

Risposta in Swift,

let predicate = NSPredicate(format: "name contains[cd] %@", stringLookingFor) 
let newList = data .filteredArrayUsingPredicate(predicate) 

I dati NSArray assomiglia a questo

[ 
{ 
    name = Carlos, 
    total = 9 
}, 
{ 
    name = Willy, 
    total = 2 
} 
]