根据 id Objective-C 过滤数据
Filter data based on id Objective-C
我有以下shared.orderItems
。我是用sharedData.orderITems
的id
来构造shared.comboItem
的。我想知道如何过滤没有 comboItemId
等于 id
.
的 sharedData.orderItems
数据
例如,在下面的例子中,有两个项目id
是71
,72
被用在了shared.ComboItems
中。我想在 shared.orderItems
上过滤 71
和 72
,只保留对象 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;
}
)
你试过谓词吗?
- 过滤
shared.comboItems
以将所有 comboItemId
放入数组中。
- 使用 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);
我有以下shared.orderItems
。我是用sharedData.orderITems
的id
来构造shared.comboItem
的。我想知道如何过滤没有 comboItemId
等于 id
.
sharedData.orderItems
数据
例如,在下面的例子中,有两个项目id
是71
,72
被用在了shared.ComboItems
中。我想在 shared.orderItems
上过滤 71
和 72
,只保留对象 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;
}
)
你试过谓词吗?
- 过滤
shared.comboItems
以将所有comboItemId
放入数组中。 - 使用 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);