2017-07-18 95 views
1

我有以下shared.orderItems。我正在使用sharedData.orderITemsid用於構建shared.comboItem。我想知道我怎麼能夠過濾sharedData.orderItems數據沒有comboItemId等於id基於ID篩選數據Objective-C

例如,在以下示例中,有兩個項目id分別是7172用於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; 
} 
) 
+0

的您可以使用sortDescriptors –

+0

請你說明的權利屬性的對象數組? – hotspring

+0

您需要排序或過濾? –

回答

2

你試過謂詞嗎?

  1. 過濾器shared.comboItems將所有comboItemId轉換爲數組。
  2. 使用謂詞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); 
4

我想我明白這個問題意味着要排除orderItems了由comboItemId屬性的簡稱comboItems數組。第一收集那些:

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]; 
+0

我收到以下問題'屬性'comboItemId'找不到類型爲'NSDictionary *'的對象'我應該使用'[excludedIds addObject:[item valueForKey:@「comboItemId」]]'而不是? – hotspring

+0

@hotspring - 那是我的不好。請參閱編輯。 – danh

+0

現在我收到以下錯誤:終止應用程序,由於未捕獲的異常'NSInvalidArgumentException',原因:'無法解析格式字符串'id NONE%@「」'在謂詞中。 – hotspring

2

您可以使用關鍵值編碼 - 集合操作從組合項目獲得ids

@distinctUnionOfObjects:返回的關鍵路徑中指定的經營者

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);