2012-09-06 89 views

回答

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 != ""; 
} 
+0

這個工程假設你的對象實際上只是字符串或你寫你的對象一個toString有沒有在它的返回值,也是我不明白你爲什麼會需要使用過濾器逗號,不是嗎只是假設所有空的空格都是空的,而不是空字符串,在這種情況下,Array.toString不會以任何方式顯示它們,因此分割會執行它。我喜歡來自jmh_gr的解決方案,但由於其他對象類型可能存在此缺陷。 – shaunhusain

+1

@shaunhusain是的,有潛在的缺陷。 jmh_gr的'IndexedCollection'示例更加防彈。但OP要求一種方法來獲得沒有迭代的項目數量 - 這當然是一種選擇。過濾器是必要的 - 嘗試運行'toString()。split(',')'沒有它 - 它返回23. – redhotvengeance

+0

啊好吧,因爲內置toString仍然會返回「」爲空,我想? – shaunhusain

1

通過使用for語法,這將迭代definded指標:

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