2016-12-30 2 views
0

У меня есть один объект-словарь в массиве.Заменить объект Dictionary в массиве с помощью NSPredicate

Я хочу заменить этот объект новым словарем.

Оба имеют одинаковый 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. Поэтому мы можем пропустить несколько строк для цикла. Но я думаю, что цикл хорош. –

ответ

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

Да, Джошуа, это подход, но бит трики, иначе для цикла хорошо. Спасибо @Joshua –

+0

не очень сложно, а просто нужно понять, как работает предикат. Я думаю, что это хороший способ познакомиться с NSPredicate [cheat sheet] (https://realm.io/news/nspredicate-cheatsheet/) – Joshua

+0

сложно найти индекс. Бит, иначе это нормально. –

0

Если я хочу, чтобы соответствовать совершенным, то я, как. Хотя я не уверен. Got по ссылке 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

Если вы используете Swift, это очень просто.

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

Смежные вопросы