2016-12-30 5 views
0

Arrayに1つの辞書オブジェクトがあります。NSPredicateを使用してArray内のDictionaryオブジェクトを置き換えます。

このオブジェクトを新しい辞書に置き換えます。

どちらも同じorder_idを持ちます。

現在、私はそれをやっています、どうすればNSPredicateでそれを行うことができますか?

NSMutableArray *orderList=[[NSUserDefaults standardUserDefaults] objectForKey:@"Orders"]; 

     //2. Find and replace the object/OrdeDetails. 
     for(int i=0;i<orderList.count;i++){ 

      NSDictionary *dictionary=orderList[i]; 

      if([dictionary[@"order_id"] isEqualToString:OrderDetails[@"order_id"]]){ 

       [orderList replaceObjectAtIndex:i withObject:OrderDetails]; 

       break; 
      } 


     } 
+1

なぜ上記の場合はNSPredicateを使用しますか? – Tander

+1

オブジェクトを 'NSPredicate'に置き換えることはできません。単にそのオブジェクトを見つけることができます。 –

+0

はい私は、私たちがNSPredicateを使うことができると考えました。だから我々はforループのいくつかの行をスキップすることができます。しかし、私はループが良いと思う。 –

答えて

1

チェックこのコード:

NSPredicate *resultPredicate = [NSPredicate 
             predicateWithFormat:@"SELF.order_id contains[cd] %@",OrderDetails[@"order_id"]]; 
NSMutableArray *arrOrders = [[NSMutableArray alloc]init]; 
    [arrOrders addObjectsFromArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"Orders"]]; 

NSArray *filteredOrder = [arrOrders filteredArrayUsingPredicate:resultPredicate]; 

if ([filteredOrder count] > 0) { 
     NSUInteger index = [arrOrders indexOfObject:[filteredOrder objectAtIndex:0]]; 
     if (index != NSNotFound) { 
      [arrOrders replaceObjectAtIndex:index withObject:OrderDetails]; 
     } 
} 
+0

しかし、私はまだループのために使用します、NSpredicateは少しトリッキーです。 –

+0

私の答えよりも適切です。 –

1

あなたはその後、その後、交換を行うあなたはしかし、それを検索することができNSPredicateを持つオブジェクトを置き換えることはできません。

これはテストなしでこれを作成しましたが、有効な構文があると思います。

これを基礎として使用することもできますし、述語を使用する際に論理を得ることを期待できます。

// construct the predicate with the given condition 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"order_id = %@",dictionary[@"order_id"]]; 

// this will filter the array according to the given predicate. if there are more than 1 entries with the given condition then you should handle that this only handle unique entries 
NSArray *array = [orderList filteredArrayUsingPredicate:predicate]; 

// assuming that order_id is unique 
NSInteger index = [orderList indexOfObject:[array lastObject]]; 
if (index != NSNotFound) // check if index is existing 
    [orderList replaceObjectAtIndex:index withObject:orderDetails]; // replace the object with the desired object 
+0

はいジョシュア、それはアプローチですが、ビットはトリッキーです。そうでなければforループは良いです。ありがとう@ジョシュア –

+0

本当にトリッキーではなく、ちょうど述語の仕組みを理解する必要があります。私はこれがNSPredicate [チートシート](https://realm.io/news/nspredicate-cheatsheet/)を知るための良い方法だと思います – Joshua

+0

トリッキーな部分はインデックスを見つけることです。それ以外の場合は問題ありません。 –

0

私は完璧に一致させたい場合は、私はLIKE、使用。私は確信していません。 ガットcheat sheet

NSPredicate *predicateSearchOrder=[NSPredicate predicateWithFormat:@"SELF.order_id LIKE[cd] %@",[responsedDict valueForKey:@"order_id"]]; 
      // 
      //  //It will be only one object with order id. 

NSArray *searchedArray=[orderList filteredArrayUsingPredicate:predicateSearchOrder]; 

if(searchedArray.count>0){ 
      NSDictionary *toModiFyDictionary=searchedArray[0]; 
      toModiFyDictionary=OrderDetails; 
} 

リンクからこれはまた、あなたがスウィフトを使用していた場合、それは非常に簡単です

0

を進めています。

public class Test : NSObject { 
    class func test() -> Void { 
     var array : [Dictionary<String, String>] = [] 

     let dic: Dictionary<String, String> = ["order_id" : "111", "name" : "good1"] 
     let dic2: Dictionary<String, String> = ["order_id" : "222", "name" : "good2"] 

     let dic3: Dictionary<String, String> = ["order_id" : "111", "name" : "good3"] 
     array.append(dic) 
     array.append(dic2) 

     let result = array.map { (elem) -> [String : String] in 
      if elem["order_id"] == "111" { 
       return dic3 
      } 
      return elem 
     } 
     print("result = \(result)") 
    } 
} 
+0

本質的に、それはforループでもあります – edisongz

関連する問題