2012-06-20 23 views
8

का एक NSArray के आधार पर विचार करें निम्नलिखित NSArray:NSPredicate 'या' छानने कुंजी

NSArray *dataSet = [[NSArray alloc] initWithObjects: 
       [NSDictionary dictionaryWithObjectsAndKeys:@"abc", @"key1", @"def", @"key2", @"hij", @"key3", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"klm", @"key1", @"nop", @"key2", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"qrs", @"key2", @"tuv", @"key4", nil], 
       [NSDictionary dictionaryWithObjectsAndKeys:@"wxy", @"key3", nil], 
       nil]; 

मैं इस सरणी फिल्टर करने के लिए वस्तुओं है कि कुंजीkey1

// Filter our dataSet to only contain dictionary objects with a key of 'key1' 
NSString *key = @"key1"; 
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN [email protected]", key]; 
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate]; 
NSLog(@"filteretSet1: %@",filteretSet1); 
शामिल शब्दकोश को खोजने के लिए कर रहा हूँ

जो उचित रूप से लौटाता है:

filteretSet1: (
     { 
     key1 = abc; 
     key2 = def; 
     key3 = hij; 
    }, 
     { 
     key1 = klm; 
     key2 = nop; 
    } 
) 

अब, मैं एनएसएआरएआरई में कुंजी के ANY युक्त शब्दकोश ऑब्जेक्ट्स के लिए डेटासेट फ़िल्टर करना चाहता हूं।

उदाहरण के लिए

, सरणी का उपयोग कर: NSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil]; मैं एक विधेय है कि वापस आती है और की सरणी किसी भी वस्तुओं है कि या तो 'कुंजी 1' या 'key3' (यानी इस उदाहरण में सब शब्दकोश वस्तुओं होगा शामिल शब्दकोश बनाना चाहते हैं। तीसरे ऑब्जेक्ट को छोड़कर वापस लौटाएं - क्योंकि इसमें 'key1' या 'key3' शामिल नहीं है)।

इस पर कोई विचार है कि मैं इसे कैसे प्राप्त करूं? क्या मुझे एक परिसर भविष्यवाणी का उपयोग करना होगा?

उत्तर

9

NSPredicate की ANY ऑपरेटर इस कवर करता है:

NSSet *keys = [NSSet setWithObjects:@"key1", @"key3", nil]; 

NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"any [email protected] in %@", keys]; 
+0

* कोई * मैं जो खो रहा था वह था। मुझे नहीं पता कि मुझे एनएसपीडिकेट क्यों मिल रहा है ताकि मेरा सिर चारों ओर लेना मुश्किल हो। आपके उत्तर के लिए धन्यवाद। मोनोलो +1 :) –

+0

क्या यह मामला संवेदनशील है? मैं अंततः पता लगाऊंगा, लेकिन मुझे उम्मीद है कि यह पहले से ही है। बाद में टिप्पणी करें। – coolcool1994

+0

@ coolcool1994 उपरोक्त भविष्य में कोई भी और IN (और SELF) केस संवेदनशील नहीं है (असल में मैं अक्सर उन्हें सभी कैप्स में लिखने के लिए लिखता हूं), कुंजी/विधि नाम हैं, इसलिए '@ allKeys _is_ केस संवेदनशील । – Monolo

1

यह करें:

NSString *key = @"key1"; 
    NSString *key1 = @"key3"; 
    NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN [email protected] OR %@ IN [email protected]",key,key1]; 
    NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate]; 
    NSLog(@"filteretSet1: %@",filteretSet1); 

निर्माण पूरी तरह से मेरे लिए। आशा है कि सहायक

+0

आपके इनपुट के लिए धन्यवाद। मैं या तो उपयोग करने में सक्षम होने के बारे में जानता हूँ। कारण मैं एक सरणी का उपयोग करना चाहता था बिल्कुल 2 चाबियों की बजाय चाबियों की किसी भी संख्या के लिए था। –

1

हालांकि सवाल का जवाब दे दिया गया है, तो आप भी ब्लॉक में अधिक स्पष्टता के लिए इस्तेमाल कर सकते हैं:

NSArray *filter = [NSArray arrayWithObjects:@"key1", @"key3",nil]; 

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){   
    NSDictionary *data = (NSDictionary*)obj; 

    // use 'filter' and implement your logic and return YES or NO 
}]; 

[dataSet filteredArrayUsingPredicate:filterBlock]; 

आप के रूप में पुन: व्यवस्थित किया जा सकता है कि चाहते हैं, शायद अपनी विधि के भीतर।