一見すると非常に単純ですが、入れ子になったループを多く使わずにこれを行うにはいくつか問題があります。
例:
var father:Array = new Array(0,1,2,3,4,5);
var son:Array = new Array(3,4,5);
father.contains(son) // returns true or 4(the starting index if the contained array)
一見すると非常に単純ですが、入れ子になったループを多く使わずにこれを行うにはいくつか問題があります。
例:
var father:Array = new Array(0,1,2,3,4,5);
var son:Array = new Array(3,4,5);
father.contains(son) // returns true or 4(the starting index if the contained array)
ActionScript 3 は、初期の頃、Adobe/Macromedia が Ecmascript に準拠させようとしていたため、実際には少しクレイジーなものをサポートしています。
だから...これを行うことができます:
var a1:Array = [1,2,3,4,5,6,7,8,9];
var a2:Array = [3,4,5];
// borrow String's indexOf function, and it magically works on Arrays
// but rename it because Array already has a different indexOf function
a1.indexOf2 = String.prototype.indexOf;
trace(a1.indexOf2(a2) > -1); // true
ただし、等価テストのためにすべての要素を文字列に変換するため、少し注意する必要があります。プリミティブの場合、ほとんど問題にはなりませんが、オブジェクトはすべて、"[object Object]"
またはそのtoString()
戻り値に変換されるため、オブジェクトでひどく壊れます。
また、-1 でないことを確認するだけでなく、実際のインデックスを何かに使用したい場合は、2 で割る必要があります。これは、数値が予想の 2 倍になるためです。これがなぜなのか正確にはわかりません:)
より一般的で信頼性の高いものが必要な場合は、明示的な検索を行う関数を作成することをお勧めします。これは簡単な例ですが、私が書いたばかりなので、簡単にバグが発生する可能性があります。
public function find(haystack:Array, needle:Array):int
{
var index:int = -1;
while(index <= haystack.length - needle.length)
{
index++;
index = haystack.indexOf(needle[0], index);
for( var i:int = 1; i<needle.length; i++)
{
if(haystack[index+i] != needle[i])
{
continue;
}
}
if( i == needle.length)
{
return index;
}
}
return -1;
}
簡単にするためにこれを試してください:
// Determines if an array contains en element (similar to the PHP function with the same name)
public function in_array(needle:*, haystack:Array):Boolean
{
for each (var element:* in haystack)
{
if (element == needle) {return true;}
}
return false;
}