如何使用另一个数组过滤对象数组以定义要过滤掉的对象

时间:2013-04-17 23:05:37

标签: objective-c sql xcode nsarray nsdictionary

在xcode中,我有一个数据库,我从在线sql数据库请求,这可以存储到数组或NSDictionary或其他类型。另外,应用程序中会生成一个数字数组,这些数字对应于数据库的一列。

我想过滤数据库,只显示与生成的数组有关的对象。过滤后,我想在字符串中列出结果。如果需要,可以将在线服务器中的数据库存储在NSArray或NSDictionary中,也可以存储我不了解的其他格式。

程序看起来像这样:

数据库数组:生成的数组:过滤数据库后的结果数组:

ID    |    Name          ID                        FilteredNames
      |
1A    |   Hannah         1A                          Hannah
2A    |   John           1B                          Steve
3A    |   Peter          2B                          Zara
1B    |   Steve
2B    |   Zara
3B    |   Kyle

结果数组“FilteredNames”转换为String列表,如下所示:

NamesString = @"Hannah, Steve, Zara" 

然后我计划将NamesString传递给标签,如下所示:

label.text=NamesString;

所以视图中的标签只显示:

                                Hannah, Steve, Zara 

我非常需要整个程序的帮助。

1 个答案:

答案 0 :(得分:1)

编辑根据Martin的评论,将谓词格式更改为更合适的格式。

- (NSArray *)filterObjects:(NSArray *)objects withNames:(NSArray *)names {
  return [objects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name IN %@", names]];
}

// given that the 'objects' array is what you get from server
  NSArray *objects = @[
                       @{@"id" : @"1A", @"name" : @"Hannah"},
                       @{@"id" : @"2A", @"name" : @"John"},
                       @{@"id" : @"3A", @"name" : @"Peter"},
                       @{@"id" : @"1B", @"name" : @"Steve"},
                       @{@"id" : @"2B", @"name" : @"Zara"},
                       @{@"id" : @"3B", @"name" : @"Kyle"}
                       ];

  NSArray *filteredObjects = [self filterObjects:objects withNames:@[@"Hannah", @"John", @"Zara"]];
  NSLog(@"filteredObjects: %@", filteredObjects); // prints them out as dictionaries

  NSString *unitedNames = [[filteredObjects valueForKeyPath:@"@unionOfObjects.name"] componentsJoinedByString:@", "];
  NSLog(@"unitedNames: %@", unitedNames); // comma separated array of names