NSPredicate根据嵌套结构中的属性过滤自定义对象

时间:2015-03-25 07:20:28

标签: ios objective-c cocoa nspredicate

我正在尝试使用NSPredicate从下面显示的结构中过滤所有CustomObjects,并为其属性“isSelected”赋值true。 我有一个嵌套结构,如:isSelectedProperty-Object-NSArray-NSDictionary-NSArray

[
  {
    "title": "ABC",
    "list": [
      <CustomObject>.isSelected = true,
      <CustomObject>.isSelected = true,
      <CustomObject>.isSelected = true
    ]
  },
  {
    "title": "ABC",
    "list": [
      <CustomObject>.isSelected = false,
      <CustomObject>.isSelected = true,
      <CustomObject>.isSelected = true
    ]
  },
  {
    "title": "ABC",
    "list": [
      <CustomObject>.isSelected = false,
      <CustomObject>.isSelected = true,
      <CustomObject>.isSelected = true
    ]
  }
]

从这种嵌套结构中,我需要过滤所有CustomObject isSelected = true。所以我的问题是,

  • 是否可以使用NSPredicate?
  • 是,那么谓词语句将过滤此结构的内容是什么?

请提供一些理解,以便我们了解如何真正处理此类结构。

编辑 - 非常接近解决方案

在谷歌搜索和帮助回答穆罕默德瓦卡斯后,我成功地使用

过滤数组如下
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"list.isSelected CONTAINS[c] %@",@true];
NSArray *aArray = [mutArrContacts filteredArrayUsingPredicate:aPredicate];
NSArray *UnWrapped = [aArray valueForKey:@"list"];



<__NSArrayI 0x7fc969cde360>(
<__NSArrayM 0x7fc969f54a10>(
<ContactData: 0x7fc969f7a590>,
<ContactData: 0x7fc969f8dee0>
)
,
<__NSArrayM 0x7fc969f736f0>(
<ContactData: 0x7fc969f68310>
)
,
<__NSArrayM 0x7fc969f737a0>(
<ContactData: 0x7fc969f70340>
)
,
<__NSArrayM 0x7fc969f87430>(
<ContactData: 0x7fc969f65170>
)
,
<__NSArrayM 0x7fc969f874d0>(
<ContactData: 0x7fc969f51690>
)

)

但是现在我正在努力将这些对象过滤成单个数组,如

(
<ContactData: 0x7fc969f7a590>,
<ContactData: 0x7fc969f8dee0>,
<ContactData: 0x7fc969f68310>,
<ContactData: 0x7fc969f70340>,
<ContactData: 0x7fc969f65170>,
<ContactData: 0x7fc969f51690>
)

1 个答案:

答案 0 :(得分:5)

是的,你可以像这样使用NSPredicate过滤自定义对象

NSPredicate *predicate = [NSPredicate    predicateWithFormat:@"ANY list.isSelected = %@",@true];
NSArray *filteredArry=[[json filteredArrayUsingPredicate:predicate] copy];
希望这会对你有所帮助。