【问题标题】:NSArray of NSDictionaries - merge dictionaries with same key value pairNSDictionaries 的 NSArray - 合并具有相同键值对的字典
【发布时间】:2014-07-02 21:08:19
【问题描述】:

我有一个 NSArrayNSDictionary 对象:

[
 {
    id = 1;
    fromDate = 2014-04-03;
    toDate = 2014-04-05;
    date = 0000-00-00;
    title = title 1
 },
 {
    id = 1;
    fromDate = 0000-00-00;
    toDate = 0000-00-00;
    date = 2014-04-03
    title = title 1
 },
 {
    id = 1;
    fromDate = 0000-00-00;
    toDate = 0000-00-00;
    date = 2014-04-04;
    title = title 1
 },
 {
    id = 2;
    fromDate = 0000-00-00;
    toDate = 0000-00-00;
    date = 2014-05-10;
    title = title 2
 },
 {
    id = 2;
    fromDate = 0000-00-00;
    toDate = 0000-00-00;
    date = 2014-05-11;
    title = title 2
 }
]

我想将具有相同 id 值的字典合并到一个字典中,结合所有日期、fromDate 和 toDate 键,获得一个这样的数组,它忽略零值:

[
  {
    id = 1,
    combinedDates = 2014-04-03, 2014-04-05, 2014-04-03, 2014-04-04;
    title = title 1
  },
  {
    id = 2,
    combinedDates = 2014-05-10, 2014-05-11;
    title = title 2
  }
]

有人能指出正确的方向吗?

【问题讨论】:

    标签: ios merge nsarray nsdictionary


    【解决方案1】:

    除了基本的蛮力,我不知道有什么方法可以做到这一点:

    -(NSArray*)combinedArray:(NSArray*)array
    {
        NSMutableArray*     combined = [NSMutableArray new];
    
        // Iterate over each unique id value
        for(id key in [NSSet setWithArray:[array valueForKeyPath:@"id"]])
        {
            // skip missing keys
            if([key isKindOfClass:[NSNull class]])
                continue;
    
            // Sub array with only id = key
            NSArray*        filtered = [array filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSDictionary* evaluatedObject, NSDictionary *bindings) {
                return [evaluatedObject valueForKey:@"date"] && [[evaluatedObject valueForKey:@"id"] isEqual:key];
            }]];
    
            // Grab the dates
            NSArray*        dates = [filtered valueForKeyPath:@"date"];
    
            // add the new dictionary
            [combined addObject:@{ @"id":key, @"combinedDates":dates }];
        }
    
        return array;
    }
    

    【讨论】:

    • 感谢@David,我已经编辑了我的问题。我正在尝试包含其他键值,例如在 preidcate 的块中添加 [evaluatedObject valueForKey:@"title"] 但我正在获得像 ` { id = 1, combinedDates = 2014-04-03, 2014- 这样的重复项04-05、2014-04-03、2014-04-04;标题 = 标题 1,标题 1; }` 我确定我遗漏了一些明显的东西
    • VakueForKeyPath 返回一个包含所有值的数组。从中创建一个集合以消除重复项,类似于 for 循环。
    • @David,我曾尝试按照您上面所说的那样获取另一个键值。但请简要解释一下。
    【解决方案2】:
    // Group By id
    -(NSMutableDictionary*)combinedArray:(NSArray*)array
    {
        NSMutableArray *categories = [[NSMutableArray alloc] init];
        for (NSDictionary *data in array) {
    
            NSString *category = [data valueForKey:@"id"];
            if (![categories containsObject:category]) {
                [categories addObject:category];
            }
        }
    
        NSMutableDictionary *categoryData = [[NSMutableDictionary alloc]init];
    
        for (NSString *strCat in categories) {
    
            NSMutableArray *catArray = [[NSMutableArray alloc]init];
    
            for (NSDictionary *data in array) {
    
                NSString *category = [data valueForKey:@"id"];
    
                if ([category isEqualToString:strCat]) {
                    [catArray addObject:data];
                }
            }
    
            [categoryData setObject:catArray forKey:strCat];
    
        }
    
        return categoryData;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多