【问题标题】:How to filter NSArray using predicate on an object property如何使用对象属性上的谓词过滤 NSArray
【发布时间】:2013-11-09 16:18:20
【问题描述】:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  [self.map removeAnnotations:self.map.annotations];
  if ([textField isEqual:self.searchText]) {
      NSPredicate *bPredicate = 
      [NSPredicate predicateWithFormat:@"name contains[c],  %@",self.searchText.text];

      self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate];
      NSLog(@" HEARE %@",self.filteredArray);
      [self markAllHotels];
  }
  return YES;
}

hotelArrayfilteredArrayNSArrays。

hotelArray 具有 hotel 类型的对象,其中 hotel 具有属性 name

问题: 当hotel.name 匹配在searchText [文本字段] 中输入的文本时,我想根据hotel.name 过滤hotelArray,但我得到一个空的self.filteredArray

【问题讨论】:

  • 缺少您的问题。您发布的代码到底有什么问题?
  • @Vishwa Patel 该代码对我不起作用。使用 ANY 会使模拟器崩溃。

标签: ios iphone objective-c


【解决方案1】:

尝试以下几行,并确保properyName 区分大小写。并且您已将 , 置于谓词格式中,这就是它不起作用的原因。只需用以下代码替换您的代码。

目标 C

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@",self.searchText.text];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate];
NSLog(@"HERE %@",self.filteredArray);

斯威夫特

var bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", self.searchText.text)
self.filteredArray = self.hotelArray.filteredArrayUsingPredicate(bPredicate)
NSLog("HERE %@", self.filteredArray)

使用迅捷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)")

【讨论】:

  • [NSString "sometext%i",4] IOS 将其设为数字​​而不是错误字符串。
  • @Anz 你在过滤字典数组吗?给定的代码在 Swift 3.0 上测试
  • @DipenPanchasara 是的
  • 您可以用您的数据和其他信息发布问题,然后可以提供解决方案
【解决方案2】:

根据您的信息,这是您的情况:

self.hotelArray      // Array in which we perform a search
self.filteredArray   // Result array
name                 // Property of the object used for the predicate

这个谓词应该适合你:

NSString *searchText = self.searchText.text;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", searchText];
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:predicate];

【讨论】:

    【解决方案3】:

    这是可能适合您的谓词方法。

    -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
    {
        [filteredContactArray removeAllObjects];
    
        NSArray *tempArray = [hotelArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains[c] %@ OR name contains[cd] %@",searchText]];
    
        filteredArray = [NSMutableArray arrayWithArray:tempArray];//if you want the filtered array to be mutable or tempArray will work as as desired by you.
    }
    

    contains[c]- 表示区分大小写的谓词。 contains[cd]- 不区分大小写的字符串

    【讨论】:

      【解决方案4】:

      查看这个库

      https://github.com/BadChoice/Collection

      它带有许多简单的数组函数,再也不用写循环了

      所以你可以这样做:

      NSArray* hotels = [self.hotelArray filter:^BOOL(Hotel *hotel) {
          [return hotel.name isEqualToString:searchText];
      }];
      

      或者干脆

      NSArray* hotels = [self.hotelArray where:@"name" is:searchText];
      

      :)

      【讨论】:

        【解决方案5】:

        我不确定这是否是你想要做的:

        -(NSArray*)searchString:(NSString*)stringToSearch inArray:(NSArray*)myArray
        {
            NSMutableArray* filtredArray = [[NSMutableArray alloc] init];
            for (NSString* elmnt in myArray)
            {
                if ([elmnt rangeOfString:stringToSearch].location != NSNotFound) [fitredArray addObject:elmnt];
            }
            return filtredArray;
        }
        

        【讨论】:

        • 我不想循环遍历元素。
        • 我想使用 filtersArrayUsingPredicate 或类似的东西
        猜你喜欢
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多