【问题标题】:Create dictionary with dictionaries of arrays (sorted by a specific custom object property)?使用数组字典创建字典(按特定的自定义对象属性排序)?
【发布时间】:2016-08-15 04:10:07
【问题描述】:

标题可能令人困惑,抱歉。也许有人可以建议我更合适的标题。

我有一个.json 文件,其结构如下。

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

解析时,我创建了一个名为contactsArrayarray。然后我可以从这个array 创建AEContact 对象,如下所示:

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

self.contacts array 中,contact.location 属性的value 是我感兴趣的。我需要根据location 属性创建相关AEContact 对象的单独arrays ,然后将这些映射到我的contactArray dictionary 中的location key

这是我迄今为止尝试过的:

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"]];
    }
}

输出是:

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

AEContact 对象具有相同的location 时,它将其设置为字典中的另一个键/值并覆盖先前的条目。我需要发生的事情是这样的:

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

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

我不确定输出是否应该/看起来像上面的预览,我只能假设我还没有实现我的目标。如何在array 中创建相关的AEContact 对象并将它们映射到我的locationsDic 中的location 键?谢谢。

【问题讨论】:

  • 一个键不能有多个值。字典的一个键和一个值。您可以将一组值作为键的值。
  • 好吧,这是有道理的。关于如何为键创建一组值的任何想法?我不希望您为我编写一堆代码,但即使您可以通过某些链接为我指明正确的方向?如果可能的话,最好与我的问题密切相关。感谢您抽出宝贵时间阅读。
  • 我对你的 for 循环感到困惑。我认为您应该在 for 循环中将对象添加到数组中。并且在 for 循环结束后,您可以将此数组添加到字典中。
  • 再说一次,这是有道理的。谢谢,它为我指明了正确的方向。虽然现在我只需要弄清楚如何根据 location 属性对对象进行排序。进行更改后,字典将每个 AECOntact 对象添加到每个位置。我应该使用某种谓词,还是在找到重复的位置值时停止另一个循环,或者创建单独的数组?感谢您的帮助。

标签: ios objective-c json nsarray nsmutabledictionary


【解决方案1】:

标题(和问题描述)有点难以理解,但我认为您正在尝试通过其位置参数索引 (AEContact) 对象数组。

我们可以在处理输入时通过更严格的命名和查找或创建模式来澄清这一点。

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 将是我认为您正在寻找的。​​p>

【讨论】:

  • 对标题和描述表示歉意,但您在弄清楚我想要实现的目标时发现了这一点。您的代码完美运行,正是我需要的! contactsByLocation 是我需要的字典。我会研究你是如何做到这一点的,因为它非常适合我的情况。我整天都在努力实现这一点。非常感谢! :)
  • 很高兴能帮上忙。我刚刚在我建议的代码中发现了一个错误。请参阅编辑。
  • 啊,是的,经过几次运行后,我发现每个数组缺少一个 AEContact 对象。我正要尝试自己修复错误,这可能需要我一段时间,所以我刚刚检查了一下,你的编辑现在工作正常。再次感谢伙计,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2012-08-15
  • 2014-02-08
相关资源
最近更新 更多