Actionscript はスパース配列を使用するため、次のような配列を使用できます。
var myArray:Array = new Array();
myArray[0] = "foo";
myArray[22] = "bar";
これで、myArray.length は 23 になります。すべての要素を反復せずに、配列内の実際の項目数を取得する方法はありますか?
Actionscript はスパース配列を使用するため、次のような配列を使用できます。
var myArray:Array = new Array();
myArray[0] = "foo";
myArray[22] = "bar";
これで、myArray.length は 23 になります。すべての要素を反復せずに、配列内の実際の項目数を取得する方法はありますか?
構文を使用して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--;
}
}
配列を反復処理したくない場合は、フィルターできます。
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 != "";
}
最も速い方法は、常に組み込み関数を使用することです。
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