合并两个ArrayCollection - Flex

时间:2011-10-06 07:56:27

标签: actionscript-3 flex actionscript flex4.5 arraycollection

我有两个ArrayCollection,我想将它们合并为一个......

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

我想要这个数组

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    

我该怎么做?

编辑:

我做了这个解决方案:

        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;
        }

但是有一个重要的问题,如果array2(b)有一个item.month,而array1(a)中没有这个值,那么该值就会丢失......

4 个答案:

答案 0 :(得分:5)

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;
}

答案 1 :(得分:0)

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);
}
在for循环之后

你可以检查“b”是否还有元素,所以你可以将它们添加到“a”,别忘了给“b”数组对象一个默认的tot_ok值。另一件事,如果“a”中的对象在“b”中不具有相同性,则可以使用它。

    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;
    }

答案 2 :(得分:0)

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
}

答案 3 :(得分:-2)

如果array2(b)有一个item.month,则array1(a)中没有使用addItem()方法将新对象添加到array1(a);