如何在 NSMutableDictionary 中搜索内容

How to search something in NSMutableDictionary

你好我有一个NSMutableArray这样的

Contactarray (

{

   "firstNAme"="name1"
   "lastName"="name2"
   "phoneNumber"="12345678902";
}

{

   "firstNAme"="name1"
   "lastName"="name2"
   "phoneNumber"="12345678902";
}

我想在 UITextField 中输入人名时搜索此人。然后应该加载过滤后的UItableView。此 NSMutableArray 包含 NSMutableDictionaries

如何从这些对象中找到匹配的对象?

假设我想搜索所有 name1 人。然后我想找到所有包含 "name1" 的对象,这些对象应该填充到另一个数组以加载 UITableview

请帮助我。 谢谢。

更新

这是我的联系人数组

<__NSArrayI 0x7b601f70>(
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
};

{
firstname = Kate;
lastName = Bell;
phone = "(415) 555-3695";
userimg = "<UIImage: 0x7b67b3a0>";
},

这是我的搜索代码

`

 [playlistArray removeAllObjects];
 NSArray *contacts=[[NSArray alloc] initWithArray:mutArraySearchContacts];
 NSPredicate *filter = [NSPredicate predicateWithFormat:@"firstname = %@ OR lastName = %@",currentSrchStr,currentSrchStr];
 playlistArray=[contacts filteredArrayUsingPredicate:filter];
 [self performSelectorInBackground:@selector(playlistsLoaded) withObject:nil];

`

但是我的playlistArray是空的。

`

(lldb) po playlistArray
<__NSArrayI 0x7b74adf0>(

)

`

我这里做错了什么?

您可以使用 keysOfEntriesPassingTest: 方法查找值等于 @"test" 的所有键。

在下面的实现中,只会找到第一个键。如果您需要对象为 @"Test" 的所有键,请不要分配 *stop.

NSString *target = @"test";

NSSet *keys = [myDictionary keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) 
{

    return (*stop = [target isEqual:obj]);

}];

当你拿到钥匙后,你可以继续下一步。

NSArray *contacts = ...; //your array of NSDictionary objects
NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@", @"name1"]];

NSArray *filteredContacts = [contacts filteredArrayUsingPredicate:filter];

如果您需要搜索更多条件,例如全名:

NSPredicate *filter = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"firstName == %@ OR lastName == %@" ,@"name1", @"name2"]];

这里是Predicate Programming Guide,说明了更高级的功能。

使用 NSPredicate 时无需迭代。试试这个。

NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] contains '%@' || SELF['lastName'] contains '%@'",currentSrchStr,currentSrchStr]];
NSArray *filterArray = [mutArraySearchContacts filteredArrayUsingPredicate:myPredicate];
NSLog(@"filterArray %@", filterArray);

更新 1: 使用 CONTAIN[C] 修改谓词以区分大小写,例如

NSPredicate * myPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"SELF['firstNAme'] CONTAINS[c] '%@' || SELF['lastName'] CONTAINS[c] '%@'",currentSrchStr,currentSrchStr]];

希望对您有所帮助!!