乍一看,这很简单,但在不使用大量嵌套循环的情况下,我会遇到一些问题。
例子:
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,因为该数字是您期望的两倍。我不完全知道这是为什么:)
如果您需要更通用和更可靠的东西,最好编写一个函数来进行显式搜索。这是一个简单的例子,我刚刚写的很容易被错误缠身:
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;
}