Halan Schlickmann
Halan Schlickmann

Reputation: 115

Creating a NSMutableArray from a NSArray Objective-C

I have an NSArray that gives me the following data:

01/14/2013 13:28:06.559 IUser Reader [71164: c07] (
         {
         "id_acompanhante" = "";
         "id_evento" = 34;
         "user_id" = 1;
         "inserido_por" = "Himself";
         name = iUser;
         status = done;
         type = User;
     }
         {
         "id_acompanhante" = 1;
         "id_evento" = 34;
         "user_id" = 1;
         "inserido_por" = iUser;
         name = "Mayara Roca";
         status = naofeito;
         type = companion;
     }
)

How do I play this data to a NSMutableArray and add another field within each item. example:

  {
     "id_acompanhante" = "";
     "id_evento" = 34;
     "user_id" = 1;
     "inserido_por" = "Himself";
     name = IUser;
     status = done;
     type = User;
     tag = 2;
 }

I added one more field "TAG".

How do I do this?

Upvotes: 7

Views: 9272

Answers (6)

Winnie
Winnie

Reputation: 769

NSArray *theOldArray; // your old array
NSMutableArray *theMutableAry = [NSMutableArray array];
for (NSDictionary *dicItem in theOldArray)
{
    NSMutableDictionary *dicWithOneMoreField = [NSMutableDictionary dictionaryWithDictionary:dicItem];
    [dicWithOneMoreField setValue:@"your value for tag" forKey:@"tag"];
    [theMutableAry addObject:dicWithOneMoreField];
}

or try the other way

NSData* archivedData = [NSKeyedArchiver archivedDataWithRootObject:theOldArray];
NSMutableArray *mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
for (NSDictionary *dicItem in mutableArray)
{
    [dicItem setValue:@"your value for tag" forKey:@"tag"];
}

Upvotes: 0

vikingosegundo
vikingosegundo

Reputation: 52227

As far as I understand, you dont need a mutable array but you need to convert the NSDictionaries within your array to be mutable. This is also answered by others.

But I want to show a nifty trick how you can set add a key/value pair to all mutable Dictionaries with on line. I use much simpler data as you, so that it is easier to see, what happens.

//just an example array of mutable Dictionary
NSMutableArray *array = [NSMutableArray array];
[array addObject:[NSMutableDictionary dictionaryWithObject:@"one" forKey:@(1)]];
[array addObject:[NSMutableDictionary dictionaryWithObject:@"two" forKey:@(2)]];
[array addObject:[NSMutableDictionary dictionaryWithObject:@"three" forKey:@(3)]];

// and here is the trick
[array setValue:@"10" forKey:@"tag"];

The array now contains

(
{
    tag = 10;
    1 = one;
},
{
    tag = 10;
    2 = two;
},
{
    3 = three;
    tag = 10;
}
)

from the NSArray docs

setValue:forKey:
Invokes setValue:forKey: on each of the array's items using the specified value and key.

- (void)setValue:(id)value forKey:(NSString *)key

Upvotes: 0

Dave
Dave

Reputation: 7717

It's as easy as calling mutableCopy on your array:

NSArray * myArray = @[@"one", @"two", @"three"];
NSMutableArray * myMut = [myArray mutableCopy];
NSLog(@"My Mut = %@", myMut);

Hope that helps!

Update Here is an example that iterates over your original array, converts items to mutable dictionary and inserts the new property. You then toss your original array and use the myMut version.

NSArray * myArray = @[@{@"key1":@"value1"}, @{@"key2":@"value2"}];
NSMutableArray * myMut = [[NSMutableArray alloc] init];
for (NSDictionary * dict in myArray) {
    NSMutableDictionary * mutDict = [dict mutableCopy];
    [mutDict setObject:@"2" forKey:@"tag"]; // Add new properties
    [myMut addObject:mutDict];
}

Upvotes: 1

Fogmeister
Fogmeister

Reputation: 77621

NSMutableArray *mutableArray = [NSMutableArray array];

for (NSDictionary *dictionary in yourArray) {
    NSMutableDictionary *mutDictionary = [dictionary mutableCopy];

    [mutDictionary setObject:[NSNumber numberWithInt:2] forKey:@"tag"];

    [mutableArray addObject:mutDictionary];
}

This is how to do what you asked. Making the array mutable will not allow you to change the contents of a dictionary inside it. You need to pull out each dictionary and make that mutable and then store it back in the array.

Upvotes: 8

Nick T
Nick T

Reputation: 947

Try this

NSMutableArray *aMutableArray = [NSMutableArray arrayWithArray:anArray];

Upvotes: 0

Volodymyr B.
Volodymyr B.

Reputation: 3441

Easy

NSMutableArray *mArray = [NSMutableArray arrayWithArray:yourArray]
[mArray addObject:yourObject];

Upvotes: 7

Related Questions