【问题标题】:Filter NSArray to make new NSArray for use on tableview methods过滤 NSArray 以创建新的 NSArray 以用于 tableview 方法
【发布时间】:2014-03-11 10:25:09
【问题描述】:

我有一个如下所示的 NSArray:

{"result":
    [
        {
            "epoch":"1371333600"
        },
        {
            "epoch":"1371420000"
        },
        {
            "epoch":"1371333600"
        }
    ]
}

我想对 NSArray 进行排序并创建一个新的,这样我就可以更轻松地使用 tableview 方法来计算节和行。

所有相同的日期都需要放在一个部分中。

该数组应该类似于下面的示例,但我不知道如何到达那里。我尝试过 NSPredicate 并使用了循环,但它不起作用。

我想要什么:

{"result":
    [
        {"data":
            [
                {
                    "epoch":"1371333600"
                },
                {
                    "epoch":"1371333600"
                }
            ]
        },
        {"data":
            [
                {
                    "epoch":"1371420000"
                }
            ]
        }
    ]
}

我的 NSPredicate 看起来像这样,但没有给我结果。

_finalArray = [[NSMutableArray alloc] init];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"epoch IN %@", [_resultArray valueForKey:@"epoch"]];
_predicateDate = [NSMutableArray arrayWithArray:[dataSortArray filteredArrayUsingPredicate:predicate]];

if ([_predicateDate count] != 0) 
    {
        NSDictionary *itemsArrayDict = [NSDictionary dictionaryWithObject:_predicateDate forKey:@"data"];
        [_finalArray addObject:itemsArrayDict];
    }

【问题讨论】:

    标签: ios nsarray nspredicate uitableview


    【解决方案1】:

    NSOrderedSet 非常适合这种场合,因为它可以让您获得唯一的字符串。

    NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"2222222" forKey:@"epoch"];
    NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"2222222" forKey:@"epoch"];
    NSDictionary *dict3 = [NSDictionary dictionaryWithObject:@"1111111" forKey:@"epoch"];
    
    NSArray *dictArray = @[dict1, dict2, dict3];
    NSMutableArray *finalArray = [[NSMutableArray alloc]init];
    NSArray *epoches = [dictArray valueForKey:@"epoch"];
    NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:epoches];
    
    for (NSString *string in orderedSet) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"epoch == %@", string];
        NSArray *resultsArray = [dictArray filteredArrayUsingPredicate:predicate];
        [finalArray addObject:resultsArray];
    }
    

    【讨论】:

      【解决方案2】:

      您好,您可以使用 NSPredicate 来过滤数组,例如:

      //NSPredicate to filter an array
      NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"hello" forKey:@"Test"]];    
      NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(Test == %@)", @"hello"]];
      

      谢谢

      【讨论】:

      • 我知道,问题是我有不同的纪元时间,有些是相同的。所有相同的东西都需要放在一个部分中。看我的例子。
      【解决方案3】:

      您似乎正在使用字典和数组。这是我所取得的成就:

      (result 
          (data
                  {
              epoch = 1371333600;
          },
                  {
              epoch = 1371333600;
          }
      ),
          (data
                  {
              epoch = 1371420000;
          }
      )
      
      )
      

      我没有使用谓词,但它看起来正在工作:)。这是代码:

      // Initial input
      NSArray *result = @[@{@"epoch":@"1371333600"},@{@"epoch":@"1371420000"},@{@"epoch":@"1371333600"}];
      
      // Get unique values for the input
      NSSet *resultSet = [NSSet setWithArray:result];
      
      // Here we are going to store the final result
      NSMutableArray *newResult = [[NSMutableArray alloc] init];
      
      // Loop over the unique items
      for (NSDictionary *uniqueItem in resultSet) {
      
          // Here we are going to store the grouped data
          NSMutableArray *dataResult = [[NSMutableArray alloc] init];
      
          // Loop over the initial input
          for (NSDictionary *resultItem in result) {
      
              // Search for all the items that are equal to the uniqe
              // I would rather include a count instead of repeating values :)
              if([uniqueItem isEqual:resultItem]) {
                  [dataResult addObject:resultItem];
              }
          }
      
          [newResult addObject:dataResult];
      }
      
      NSLog(@"%@", newResult);
      

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-03
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多