2013-04-05 13 views
9

Ich habe eine NSArray mit NSDictionaries. Einer der Wörterbücherschlüssel in einem der Arrays enthält einen Wert. Ich möchte die NSDictionary mit diesem Wert abrufen.Abrufen von NSDictionary von NSArray, wo Wörterbuchschlüssel Wert hat X

Mein Array:

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

So würde Ich mag das Wörterbuch erhalten, die DisplayName Satz PurchaseAmount (Groß- und Kleinschreibung) enthält.

Wie kann ich das erreichen?

+3

sollten Sie in der Lage sein, 'für das NSPredicate' zu ​​verwenden. [Siehe ähnliches Beispiel hier] (http://stackoverflow.com/q/958622/119114). – Nate

+0

Thnx für den Tipp. Ich füge die Lösung hinzu, die ich zur Antwort verwendet habe –

Antwort

17

Die folgende mein Problem gelöst:

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

Thnx zu Benutzer Nate für seinen Kommentar zu meiner Frage!

+3

Eigentlich sind sowohl diese Antwort, als auch [insbesondere Lindinax's Antwort] (http://stackoverflow.com/a/15831638/119114) besser als die, die Sie angenommen haben. Bhargavis Antwort prüft, ob ein Schlüssel * die Zeichenfolge enthält, aber Ihre Frage nach einem Ergebnis mit einem Schlüssel, der einem bestimmten Wert entspricht. Im Allgemeinen sind diese beiden nicht das Gleiche. Es kann keinen Unterschied für Ihre Schlüsselnamen machen, aber für andere könnte es sehr gut sein. – Nate

+0

Sie beantworten Ihre eigene Frage falsch, da Sie nach "case insensitive" gefragt haben. Zumal du es als das akzeptierte gesetzt hast. – lindinax

5

Verwenden NSPredicate diese Weise

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

Hier Filter Ihre Wörterbücher halten wird, die enthält Display zu PurchaseAmount gesetzt (Groß- und Kleinschreibung)

+0

Schön! Vielen Dank. Besser als meine neu gefundene Lösung. –

+0

Eigentlich ist das ** nicht ** was die Frage gestellt hat. Ihr Prädikat findet Übereinstimmungen, bei denen der Schlüssel ** die Zeichenfolge enthält. Wenn ein anderer Schlüssel eine Obermenge dieses Schlüsselnamens ist, gibt Ihr Filter ein * falsch positives *. (z.B. 'DisplayName =" PurchaseAmountWithTax "';) – Nate

+0

Sie haben Recht, obwohl Bhargavis Lösung sicher nützlich ist! –

9

LIKE [cd] wird auch tun es

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

zurück

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

mit Hilfe von über 2 Zeilen erhalten Sie alle Wörterbuch mit Displayname = "PurchaseAmount" get

3

Antwort in Swift,

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

Die Daten NSArray sieht wie folgt aus

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