0

Actionscript はスパース配列を使用するため、次のような配列を使用できます。

var myArray:Array = new Array();
myArray[0] = "foo";
myArray[22] = "bar";

これで、myArray.length は 23 になります。すべての要素を反復せずに、配列内の実際の項目数を取得する方法はありますか?

4

3 に答える 3

1

構文を使用してfor、定義されたインデックスを反復します。

public static function definedCount(arr:Array):uint {
    var ctr:uint = 0;
    for(ix:* in arr)
        ctr++;
    return ctr;
}

スパース配列内のアイテム数を頻繁にチェックする必要がある場合は、アイテム数を個別に追跡するコレクション クラスにラップする必要があります。何かのようなもの:

public class IndexedCollection { 
    private var _arr:Array = [];
    private var _itemCount:uint = 0;

    public function get count():uint {
        return _itemCount;
    }

    public function getItem(index:uint):* { 
        return _arr[index]; 
    }

    public function setItem(index:uint, value:*):void {
        if(_arr[index] === undefined)
            _itemCount++;
        _arr[index] = value; 
    }

    public function delete(index:uint):void { 
        if(_arr[index] === undefined) 
            return;
        delete _arr[index]; 
        _itemCount--;
    }
}
于 2012-09-06T21:11:12.673 に答える
1

配列を反復処理したくない場合は、フィルターできます。

var myArray:Array = new Array();
myArray[0] = "foo";
myArray[22] = "bar";

var numberOfItems:int = myArray.toString().split(',').filter(isItem).length;

function isItem(item:*, index:int, array:Array):Boolean
{
  return item != "";
}
于 2012-09-06T21:22:58.807 に答える
1

最も速い方法は、常に組み込み関数を使用することです。

    function myFilter(item:*, index:int, array:Array):Boolean{
        if(item)
        {
            return true;
        }else{
            return false;
        }
    }

    var myArray:Array = new Array();
    myArray[0] = "foo";
    myArray[22] = "bar";
    trace(myArray.length) // 23
    var myMyNewArray:Array = myArray.filter(myFilter)
    trace(myMyNewArray .length) // 2
于 2012-09-07T13:59:54.873 に答える