根据 id Objective-C 过滤数据

Filter data based on id Objective-C

我有以下shared.orderItems。我是用sharedData.orderITemsid来构造shared.comboItem的。我想知道如何过滤没有 comboItemId 等于 id.

sharedData.orderItems 数据

例如,在下面的例子中,有两个项目id7172被用在了shared.ComboItems中。我想在 shared.orderItems 上过滤 7172,只保留对象 ID 1.

 (lldb) po sharedData.orderItems
<__NSArrayM 0x174050860>(
{
    Note = "";
    Quantity = 1;
    id = 72;
},
{
    Note = "";
    Quantity = 1;
    id = 71;
},
{
    Note = "";
    Quantity = 2;
    id = 1;
}
)


(lldb) po sharedData.comboItems
<__NSArrayM 0x174247620>(
{
    Note = "";
    Quantity = 1;
    comboItemId = 72;
    id = 3;
},
{
    Note = "";
    Quantity = 1;
    comboItemId = 71;
    id = 19;
},
{
    Note = "";
    Quantity = 1;
    comboItemId = 72;
    id = 20;
},
{
    Note = "";
    Quantity = 1;
    comboItemId = 72;
    id = 21;
}
)

你试过谓词吗?

  1. 过滤 shared.comboItems 以将所有 comboItemId 放入数组中。
  2. 使用 Predicate 和 NOT IN 来过滤 sharedData.orderItems

解法:

NSArray *unique = [shared.comboItems valueForKeyPath:@"@distinctUnionOfObjects.comboItemId"];
NSPredicate *nonePredicate = [NSPredicate predicateWithFormat: @"NOT(id IN %@)", unique];
NSArray *filtered = [sharedData.orderItems filteredArrayUsingPredicate:nonePredicate];
NSLog(@"Filtered: %@", filtered);

我想我理解这个问题的意思是您要排除 comboItems 数组中的 comboItemId 属性引用的 orderItems。首先收集那些:

NSMutableSet *excludedIds = [NSMutableSet set];
for (NSDictionary *item in sharedData.comboItems) {
    [excludedIds addObject:item[@"comboItemId"]]; // EDIT
}

数组可以通过谓词过滤,并且可以用格式字符串指定 (see here)。所以你需要:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)", excludedIds];
NSArray *filtered = [sharedData.orderItems filteredArrayUsingPredicate:predicate];

您可以使用键值编码 - 集合运算符从组合项中获取ids

@distinctUnionOfObjects: Returns运算符右边的键路径中指定的属性中的对象数组

NSArray *compoIds = [sharedData.CompoItems valueForKeyPath:@"@distinctUnionOfObjects.comboItemId"];

NSPredicate *dupIdsPredicate = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
     NSDictionary *orderItemDictionary = (NSDictionary *) obj;
     return  ![compoIds containsObject:[orderItemDictionary valueForKey:@"id"]];
}];

NSArray *unionOfIDs =  [sharedData.orderItems filteredArrayUsingPredicate:dupIdsPredicate];

NSLog(@"%@", unionOfIDs);