如何检查数组是否包含另一个数组?

Mar*_*sis 3 flash actionscript-3

乍一看它非常简单,但是我在使用很多嵌套循环时遇到了一些问题.

例:

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)
Run Code Online (Sandbox Code Playgroud)

Pet*_*all 5

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
Run Code Online (Sandbox Code Playgroud)

但是你需要有点小心,因为它会将所有元素转换为字符串以进行相等性测试.对于原语来说,它通常无关紧要,但它会与对象分离,因为它们都将被转换为"[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;
    }
Run Code Online (Sandbox Code Playgroud)