2016-04-21 5 views
0

Der Titel kann verwirrend sein, entschuldigt. Vielleicht kann mir jemand einen passenderen Titel empfehlen.Wörterbuch mit Wörterbüchern von Arrays erstellen (sortiert nach einer bestimmten benutzerdefinierten Objekteigenschaft)?

Ich habe eine .json Datei wie folgt strukturiert.

"sections": [{ 
      "title": "Locations", 
      "key": "location" 
      }], 
"contacts": [{ 
      "title": "Social Worker", 
      "name": "Mrs X", 
      "office": "xxxxxxxx", 
      "location": "Lisburn", 
      "department": "xxxxxxxx", 
      "telephone": "xxx xxxxxxxx" 
      },... 

Wenn diese Parsen, erstelle ich ein arraycontactsArray genannt. Ich kann dann AEContact Objekte aus dieser array wie so erstellen:

for (NSDictionary *contactDic in [contactsArray valueForKey:@"contacts"]) { 
    // Create AEContact objects 
    _contact = [[AEContact alloc] initWithDictionary:contactDic]; 
    [contacts addObject:_contact]; 
} 
self.contacts = [contacts copy]; 

Im self.contactsarray, die value für die contact.location Eigenschaft ist, was ich bin interessiert Ich separaten arrays verwandter AEContact Objekte basierend auf der erstellen müssen. location Eigenschaft, Karte dann diese an die locationkey in meinem contactArraydictionary

das ist, was ich bisher versucht habe:

NSMutableDictionary *locationsDic = [NSMutableDictionary new]; 
// Loop through contacts 
for (int i = 0; i < self.contacts.count; i++) { 
    // Sort by location 
    if ([self.contacts[i] valueForKey:@"location"] == [[[contactsArray valueForKey:@"contacts"] objectAtIndex:i] valueForKey:@"location"]) { 
     [locationsDic setValue:self.contacts[i] forKey:[[[contactsArray valueForKey:@"contacts"] objectAtIndex:i] valueForKey:@"location"]]; 
    } 
} 

Und der Ausgang ist:

{ 
    Ballynahinch = "<AEContact: 0x15dda1fc0>"; 
    Bangor = "<AEContact: 0x15dda2210>"; 
    Lisburn = "<AEContact: 0x15dda1c70>"; 
    ... 
} 

Wenn ein AEContact Objekt denselben location hat, sie es als einen weiteren Schlüssel/Wert im Wörterbuch setzt und überschreibt den vorherigen Eintrag. Was ich brauche, passiere so etwas wie diese:

{ 
    Lisburn = "<AEContact: 0x15dda18f0>", 
       "<AEContact: 0x15dda18f0>", 
       "<AEContact: 0x15dda18f0>"; 

    Bangor = "<AEContact: 0x15dda18f0>", 
      "<AEContact: 0x15dda18f0>", 
      "<AEContact: 0x15dda18f0>"; 
} 

Ich bin nicht sicher, ob die Ausgabe sollte sollte/wie die Vorschau oben schaut, kann ich nur annehmen, als ich noch nicht mein Ziel erreicht haben. Wie kann ich die zugehörigen AEContact Objekte in einem array erstellen und diese auf location Schlüssel in meinem locationsDic? Vielen Dank.

+1

Sie können nicht mehrere Werte für einen Schlüssel haben. Ein Schlüssel und ein Wert für ein Wörterbuch. Sie können ein Array mit Werten als Wert für den Schlüssel angeben. –

+0

Ok das macht Sinn. Irgendwelche Ideen, wie ich ein Array von Werten für den Schlüssel erstellen kann? Ich erwarte nicht, dass Sie eine Menge Code für mich schreiben, aber selbst wenn Sie mich durch einige Links in die richtige Richtung lenken könnten? Idealerweise möglichst eng mit meinem Thema verbunden. Danke, dass du dir die Zeit zum Lesen genommen hast. – rosshump

+1

Ich bin verwirrt von ur for loop. Ich denke, dass Sie die Objekte zu einem Array hier für for loop hinzufügen sollten. Und nachdem die for-Schleife beendet ist, können Sie dieses Array zu dem Wörterbuch hinzufügen. –

Antwort

1

Der Titel (und die Problembeschreibung) sind ein wenig schwer zu folgen, aber ich denke, Sie versuchen, ein Array von (AEContact) Objekte durch ihre Position Parameter zu indizieren.

Wir können dies nur mit einer engeren Benennung und mit einem Find-or-create-Muster klären, wie wir die Eingabe verarbeiten.

NSDictionary *jsonResult = // the dictionary you begin with 
NSArray *contactParams = jsonResult[@"contacts"]; 
NSMutableDictionary *contactsByLocation = [@{} mutableCopy]; 

for (NSDictionary *contactParam in contactParams) { 
    NSString *location = contactParam[@"location"]; 

    // here's the important part: find the array of aecontacts in our indexed result, or 
    // create it if we don't find it 
    NSMutableArray *aeContacts = contactsByLocation[location]; 
    if (!aeContacts) { 
     aeContacts = [@[] mutableCopy]; 
     contactsByLocation[location] = aeContacts; 
    } 
    AEContact *aeContact = [[AEContact alloc] initWithDictionary:contactParam]; 
    [aeContacts addObject:aeContact]; 
} 

contactsByLocation wird sein, was ich denke, Sie suchen.

+0

Viele Entschuldigungen über den Titel und die Beschreibung, aber Sie waren genau darin, herauszufinden, was ich erreichen wollte. Dein Code funktioniert perfekt und genau das, was ich brauche! 'contactsByLocation' ist das Wörterbuch, das ich brauche. Ich werde genau untersuchen, wie Sie das erreicht haben, weil es perfekt für meine Situation ist. Ich habe den ganzen Tag mit dem Kopf geschlagen und versucht, dies umzusetzen. Danke vielmals! :) – rosshump

+1

froh, dass ich geholfen habe. Ich habe gerade einen Fehler im Code entdeckt, den ich vorgeschlagen habe. Bitte siehe Bearbeiten. – danh

+0

Ah ja, nach ein paar Läufen habe ich bemerkt, dass ein "AEContact" -Objekt pro Array fehlt. Ich wollte gerade versuchen, den Fehler selbst zu beheben, es hätte mich wahrscheinlich eine Weile gedauert, also habe ich einfach zurückgecheckt und dein Edit funktioniert nun einwandfrei. Danke nochmal Mann, schätze wirklich die Hilfe! – rosshump

Verwandte Themen