関数の配列がわかりませんが、配列で指定された一致する項目をどのように見つけますか? 例えば:
var fruit:Array = ["apples", "oranges", "grapes", "oranges", "apples", "grapes"];
配列内のリンゴの数だけを表示するにはどうすればよいですか?
関数の配列がわかりませんが、配列で指定された一致する項目をどのように見つけますか? 例えば:
var fruit:Array = ["apples", "oranges", "grapes", "oranges", "apples", "grapes"];
配列内のリンゴの数だけを表示するにはどうすればよいですか?
簡単に、あなたはこれを行うことができます:
private function getCount(fruitArray:Array, fruitName:String):int {
var count:int=0;
for (var i:int=0; i<fruitArray.length; i++) {
if(fruitArray[i].toLowerCase()==fruitName.toLowerCase()) {
count++;
}
}
return count;
}
var fruit:Array = ["apples", "oranges", "grapes", "oranges", "apples", "grapes"];
var appleCount=getCount(fruit, "apples"); //returns 2
var grapeCount=getCount(fruit, "grapes"); //returns 2
var orangeCount=getCount(fruit, "oranges"); //returns 2
配列内のアイテムの数と、さまざまなアイテムを検索する頻度によっては、ものをカウントするたびに配列全体を for ループで反復処理するのは非常にコストがかかる場合があります (これは、次の場合に発生します)。他の2つの答えが示唆することをしました)。配列を 1 回だけ反復し、単一の数値ではなくcountersのリストを返す count 関数が必要になる場合があります。
function countItems( arr:Array ) : Object {
var counts : Object = {};
for each ( var item : String in arr ) {
if (counts.hasOwnProperty(item)) counts[item]++;
else counts[item] = 1;
}
return counts;
}
var fruit:Array = ["apples", "oranges", "grapes", "oranges", "apples", "grapes"];
var counts : Object = countItems(fruit);
trace (counts["apples"]); // => 2
trace (counts["oranges"]); // => 2
trace (counts["grapes"]); // => 2
var stringToSearch:String = "apples";
var pattern:RegExp = new RegExp(/\b\b/.source+stringToSearch, "g");
var matches:Array = fruit.toString().match(pattern);
//
trace(matches.length);
免責事項:配列に多くの要素がある場合(たとえば、fruit.length> 1000)は、これを使用しないでください。コンパクトですが、ここに掲載されている他のソリューションよりも遅くなる可能性があります。もう1つ指摘しておきたいのは、ここでは、「一致するアイテム」は「文字列」であると想定しているということです。
function countOccurrences( haystack, needle ){
var index : int = -1;
var counter : int = -1;
do{
counter++;
index = haystack.indexOf( needle, index + 1 );
}while( index >= 0 );
return counter;
}
var fruit:Array = ["apples", "oranges", "grapes", "oranges", "apples", "grapes"];
trace( countOccurrences( fruit, "apples" ) ); //outputs '2'
次のようなものを試してください
private function makeFilter(filterValue:String):Function {
var fn:Function = function (obj:Object, index:int=0, arr:Array=[]):Boolean {
if (String(obj)==filterValue) {
return true;
}
return false;
}
return fn;
}
//somewhere else:
var filterFunction:Function = makeFilter('apples');
var appleCount:int = fruit.filter(filterFunction).length;
参考までに、このアプローチの詳細: http://www.gasi.ch/blog/functional-actionscript-1/