How to filter NSArray using predicate on an object property
Try following lines, and make sure properyName
is case sensitive. and you have placed ,
in predicate format, thats why its not working. just replace your code with following.
Objective C
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@",self.searchText.text];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate];
NSLog(@"HERE %@",self.filteredArray);
Swift
var bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", self.searchText.text)
self.filteredArray = self.hotelArray.filteredArrayUsingPredicate(bPredicate)
NSLog("HERE %@", self.filteredArray)
Using swift filter
var searchText = "Galaxy"
let filteredArray = hotelArray.filter { $0["name"] == searchText }
print("** Result ** \n\(filteredArray)")
Swift 3.0
let arrEmp = [["name": "James", "age" : 27, "city" : "New york"],
["name": "Johnson", "age" : 24, "city" : "London"],
["name": "Alex", "age" : 28, "city" : "Newark"],
["name": "Mark", "age" : 25, "city" : "Paris"],
["name": "Steve", "age" : 25, "city" : "Silicon Valley"],
["name": "Lary", "age" : 28, "city" : "New york"]]
// *** Filter by Name exact match ***
var filterByName = arrEmp.filter { $0["name"] == "Mark" }
print("filterByName \(filterByName)")
// *** Filter by Age ***
var filterByAge = arrEmp.filter { $0["age"] as! Int > 25 }
print("filterByAge \(filterByAge)")
Swift 4.0
var filterByName = arrEmp.filter
do {
$0["name"] == "Mark"
}
print("filterByName filterByName)")
var filterByAge = arrEmp.filter
do {
$0["age"] as! Int > 25
}
print("filterByAge filterByAge)")
Using NSPredicate to filter an NSArray of objects based on a property which is an NSDictionary
You don't provide any code about you're using NSPredicate
, so I wrote a simple example. Maybe this will help you.
@objc class Dummy: NSObject {
let propertyOne: Int = 1
let propertyTwo: Int = 1
let propertyThree: NSDictionary
init(dict: NSDictionary) {
propertyThree = dict
super.init()
}
}
let arr: NSArray = [
Dummy(dict: ["keyOne" : "one"]),
Dummy(dict: ["keyOne" : "two"]),
Dummy(dict: ["keyOne" : "three"]),
Dummy(dict: ["keyOne" : "one"]),
Dummy(dict: ["keyOne" : "five"])
]
let predicate = NSPredicate(format: "SELF.propertyThree.keyOne == 'one'")
let results = arr.filteredArrayUsingPredicate(predicate)
print(results)
Filter NSArray based on another array using predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self.username IN %@)", [some_usernames valueForKey:@"username"]];
NSArray *remaining_usernames = [all_usernames filteredArrayUsingPredicate:predicate];
complete example
@interface Alpha : NSObject
@property (nonatomic, copy) NSString *username;
-(instancetype) initWithUsername:(NSString *)username;
@end
@implementation Alpha
-(instancetype) initWithUsername:(NSString *)username
{
self = [super init];
if (self) {
self.username = username;
}
return self;
}
-(NSString *)description{
return [NSString stringWithFormat:@"%@: %@", NSStringFromClass([self class]), self.username];
}
@end
NSArray *all_usernames = @[[[Alpha alloc] initWithUsername:@"a"], [[Alpha alloc] initWithUsername:@"b"], [[Alpha alloc] initWithUsername:@"z"], [[Alpha alloc] initWithUsername:@"f"], [[Alpha alloc] initWithUsername:@"e"]];
NSArray *some_usernames = @[[[Alpha alloc] initWithUsername:@"b"], [[Alpha alloc] initWithUsername:@"f"]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"not (self.username IN %@)", [some_usernames valueForKey:@"username"]];
NSArray *remaining_usernames = [all_usernames filteredArrayUsingPredicate:predicate];
NSLog(@"%@", remaining_usernames);
prints
(
"Alpha: a",
"Alpha: z",
"Alpha: e"
)
Filter Array of custom objects using NSPredicate in Objective C
Did you tried with ||
OR operator & lowercaseString
.
self.searchResultForName = [self.multiPracticeDetailsArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
ObjectHolder *obj = (ObjectHolder*)evaluatedObject;
return [[obj.Name lowercaseString] hasPrefix:[searchText lowercaseString]] || [[obj.ID lowercaseString] hasPrefix:[searchText lowercaseString]] ;
}]];
filter duplicate from NSArray using object property
First of all thank you all for all your tips, this is how I was able to solve my problem:
-( NSArray *) filterOutDuplicateOrder: (NSArray *)unFilteredArray
{
// First sort array by descending so I could capture the max id
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"itemID" ascending:NO];
NSArray *sortedDescArray = [unFilteredArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
// Filter out duplicates using typeID
NSMutableArray *filteredArrayOfObjects = [[NSMutableArray alloc] init];
for (Order *order in sortedDescArray)
{
if(!([[filteredArrayOfObjects valueForKeyPath:@"typeID"] containsObject:order.typeID]))
{
[filteredArrayOfObjects addObject:progressNote];
}
}
return resultArray;
}
Filter NSArray of objects to have unique property object
You will need to override isEqual method inside Manager class (and possibly in Account class as well). After that add Managers to array by first checking, if array already contains Manager with such Account. Check possible solution below:
- override Manager isEqual
- (BOOL)isEqual:(id)object {
if (object == self) {
return YES;
} else if (![object isKindOfClass:[Manager class]]) {
return NO;
}
Manager *manager = (Manager *)object;
return [self.account isEqual:manager.account];
}
- override Account isEqual (NB! only if it is needed)
- (BOOL)isEqual:(id)object {
if (object == self) {
return YES;
} else if (![object isKindOfClass:[Account class]]) {
return NO;
}
Account *account = (Account *)object;
return [self.someUniqueId isEqual:account.someUniqueId];
}
- filter array:
NSMutableArray *filteredManagers = [NSMutableArray array];
[managers enumerateObjectsUsingBlock:^(Manager *manager, NSUInteger idx, BOOL *stop) {
if (![filteredManagers containsObject:manager]) {
[filteredManagers addObject:manager];
}
}];
Related Topics
How to Integrate Nsurlconnection with Uiprogressview
Detecting If a User Is Moving in a Car
How to Detect Live Changes on Textfield in Swiftui
How to Define the Size of a Collectionview on Rotate
Ios: Determine If Device Language Is Right to Left (Rtl)
How to Select Range of Values When Using Arc4Random()
Calling Uiviewcontroller Method from App Delegate
How to Use Swift Repl with iOS Sdk
Avplayer Stops Playing Video After Buffering
Fbsopenapplicationerrordomain Code =4 Error
React Native iOS Build:Can't Find Node
Swift:Missing Argument Label 'Xxx' in Call
How to Subclass Uitableviewcontroller in Swift
Read a Text File Line by Line in Swift
Uiview. Why Does a Subviews Outside Its Parent's Extent Not Receive Touches