2015-01-22 3 views
3

при реализации функции поиска Мне нужно фильтровать массив словарей. Я использую метод auto complete textfield для строки поиска и сохраняю его в строке. Я смог разобрать массив, но, столкнувшись с ниже JSONФильтр массива словарей по NSString

[{"CertProfID":"4","Name":"Dodge","Location":"loc4","City":"city4","State":"state4","Zip":"zip5","Website":"http:\/\/cnn.com","Phone":"phone4","Email":"email4"}, 
{"CertProfID":"5","Name":"cat","Location":"loc5","City":"city5","State":"State5","Zip":"zip5","Website":"web5","Phone":"phone5","Email":"email5"}] 

Здесь мне нужно фильтровать словари, чтобы сделать его закончить

Я попытался с ниже код, но его возвращение массив с нулевыми значениями :(

NSString *substring = [NSString stringWithString:textField.text]; 
    NSLog(@"substring %@",substring); 
    NSMutableArray *arr2Filt= [arraylist valueForKey:@"Name"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",substring]; 
    filteredarr = [NSMutableArray arrayWithArray:[arr2Filt filteredArrayUsingPredicate:predicate]]; 
+0

SELF не propertiy/ключ в вас Сыроватского. Таким образом, результат, конечно, 0 хитов. (Muhammad Waqas ответ) –

ответ

2

Вот один наблюдение состоит в том, что filteredArrayUsingPredicate является метод NSArray и вы используете NSMutableArray вместо этого.

Изменить NSMutableArray с временным NSArray объект для предиката.

Например:

NSString *substring = [NSString stringWithString:textField.text]; 

NSArray *tempArray = [arraylist valueForKey:@"Name"]; 

// If [arraylist valueForKey:@"Name"]; line returns NSMutableArray than use below line 
// NSArray *tempArray = [NSArray arrayWithArray:[arraylist valueForKey:@"Name"]]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",substring]; 

filteredarr = [[tempArray filteredArrayUsingPredicate:predicate] mutableCopy]; 
+0

Я уже сделал это свой возвращающийся массив элементов, но мне нужно получить массив словарей назад @kampai –

+0

Какие у вас элементы? Вы имеете в виду, что хотите сортировать на основе словаря? – Kampai

8

Этот код будет решить вашу проблему он будет возвращать массив словарей

NSString *substring = [NSString stringWithString:textField.text]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Name contains[c] %@",searchString]; 
NSArray *filteredArry=[[arrayOfDict filteredArrayUsingPredicate:predicate] copy]; 

arrayOfDict Ваш исходный массив словарей

Swift 3.0 Версия :::

var namePredicate = NSPredicate(format: "Name contains[c] %@",searchString); 

let filteredArray = arrayOfDict.filter { namePredicate.evaluate(with: $0) }; 

print("names = ,\(filteredArray)") 

Надеется, что это поможет вам

2

Вы можете использовать блоки вместо этого. Они намного менее волнительны в отношении условий матча.

NSString *substring = [NSString stringWithString:textField.text]; 
NSLog(@"substring %@",substring); 
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject[@"Name"] containsString:substring]; 
}]; 
filteredarr = [NSMutableArray arrayWithArray:[arraylist filteredArrayUsingPredicate:predicate]]; 
1

Привет Я знаю, что есть много любой ответ, В моем случае я сохраненные значения Как JSON MODEL объекта, это код, используя JSON MODEL

NSString *searchString = searchBar.text; 
    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     NSDictionary *temp=[evaluatedObject toDictionary]; 
     return [temp[@"user"][@"firstName"] localizedCaseInsensitiveContainsString:searchString]; 
}]; 
    filteredContentList = [NSMutableArray arrayWithArray:[searchListValue filteredArrayUsingPredicate:predicate]]; 
    [tableViews reloadData]; 

searchListValue является NSMutableArray, который содержит объекты модели объекта json. Если кому-то нужна помощь в этом отношении, просто пинговать меня

Swift версия выше 2,2

var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"]; 
var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"]; 
var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"]; 
var attributeValue = "ka"; 

var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict]; 

//var namePredicate = 
// NSPredicate(format: "firstName like %@",attributeValue); 
//uncomment above line to search particular word 
let namePredicate = 
    NSPredicate(format: "firstName contains[c] %@",attributeValue); 
let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) }; 
print("names = ,\(filteredArray)"); 

Подробнее об этом refer here

Смежные вопросы