Marcx
Marcx

Reputation: 6826

Merge two ArrayCollection - Flex

I have two ArrayCollection and I want to merge them into one...

arr1 = 
[0] -> month = 07
       tot_err = 15
[1] -> month = 08
       tot_err = 16
[2] -> month = 09
       tot_err = 17


arr2 = 
[0] -> month = 07
       tot_ok = 5
[1] -> month = 08
       tot_ok = 6
[2] -> month = 09
       tot_ok = 7

I would like to have this array

arr3 = 
[0] -> month = 07
       tot_err = 15
       tot_ok = 5
[1] -> month = 08
       tot_err = 16
       tot_ok = 6
[2] -> month = 09
       tot_err = 17
       tot_ok = 7    

How can I do it?

EDIT:

I did this solution:

        private function mergeArrays(a:ArrayCollection, b:ArrayCollection):ArrayCollection
        {
            for (var i:int=0;i<a.length;i++)
                for each(var item:Object in b)
                {                   
                    if( a[i].month == item.month){
                         a[i].tot_err = item.tot_err;
                    }
                }
            return a;
        }

But there is an important problem, if array2 (b) has a item.month that there isn't in the array1 (a) the value is lost...

Upvotes: 0

Views: 2924

Answers (4)

pho
pho

Reputation: 25489

private function mergeArrayCollections(a:ArrayCollection, b:ArrayCollection):ArrayCollection {
    var c:ArrayCollection=new ArrayCollection(b.toArray()); //clone b so as not to modify b
    //This loop handles all objects common to a and b
    for each(var o:Object in a) {
        for (var i:int=0; i<c.length; i++) {
            var p:Object=c.getItemAt(i);
            if(o.month==p.month) {
                //if the month is the same then add the property to a
                o.tot_ok=p.tot_ok;
                c.removeItemAt(i);
                break;
            }
        }
    }
    //This loop adds the leftover items from c to a
    for each(var q:Object in c) {
        q.tot_err=-1; //add this so that all objects in a are uniform
        a.addItem(q);
    }
    return a; //Unnecessary return, a will be modified by reference
}

Upvotes: 0

Santhosh Nayak
Santhosh Nayak

Reputation: 2288

if array2 (b) has a item.month that there isn't in the array1 (a) use addItem() method to add new object to array1 (a) ;

Upvotes: -2

Vladimir Tsvetkov
Vladimir Tsvetkov

Reputation: 3013

private function mergeArrays(a:ArrayCollection, b:ArrayCollection):ArrayCollection
{
    var result:ArrayCollection = new ArrayCollection();
    var months:Dictionary = new Dictionary();
    for (var i:int = 0; i < a.length; i++)
    {
        var mergedItem:Object = new Object();
        mergedItem.month = a[i].month;
        mergedItem.tot_ok = a[i].tot_ok;
        mergedItem.tot_err = null;
        for (var j:int = 0; j < b.length; j++)
        {                   
            if(a[i].month == b[j].month)
            {
                mergedItem.tot_err = b[j].tot_err;
            }
        }
        month[mergedItem.month] = true;
        result.addItem(mergedItem);
    }
    // so far we have handled all occurrences between a and b,
    // now we need to handle the items from b that are left
    for each (var bItem:Object in b)
    {
        mergedItem = new Object();
        mergedItem.month = bItem.month;
        mergedItem.tot_err = bItem.tot_err;
        mergedItem.tot_ok = null;
        if (months[mergedItem.month] == null)
        {
            month[mergedItem.month] = true;
            result.addItem(mergedItem);
        }
    }
    return result;
}

Upvotes: 5

ymutlu
ymutlu

Reputation: 6715

if( a[i].month == item.month){
   a[i].tot_err = item.tot_err;
   // remove the item from b here. dontknow arraycollection
   // should be like b.remove(item);
}

after for loops you can check if "b" still have elements, so you can add them to "a", dont forget to give "b" array objects a default tot_ok value. And another thing if an object in "a" that doesnt have equalivant in "b" you can use this.

    private function mergeArrays(a:ArrayCollection, b:ArrayCollection):ArrayCollection
    {
        var ex:Boolean = true;
        for (var i:int=0;i<a.length;i++){
            for each(var item:Object in b)
            {                   
                if( a[i].month == item.month){
                     a[i].tot_err = item.tot_err;
                     ex = true;
                }else{
                     ex = false;
                }
            }
            if(!ex){
               // give a default value here.
               a[i].tot_err = 0;
            }
        }


        return a;
    }

Upvotes: 0

Related Questions