AS3 检查数组以查看值是否存在

AS3 Checking an Array to see if a value exists

我有一个数组:

public var myMap: Array = [ //Set tile locations
                        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
                        [1, 0, 0, 0, 13, 2, 9, 10, 6, 1],
                        [1, 0, 0, 0, 0, 0, 2, 2, 2, 1],
                        [1, 0, 2, 4, 2, 0, 3, 0, 7, 1],
                        [1, 3, 2, 2, 0, 3, 2, 0, 0, 1],
                        [1, 0, 3, 5, 13, 0, 8, 2, 0, 1],
                        [1, 11, 2, 3, 2, 0, 2, 12, 0, 1],
                        [1, 0, 2, 2, 2, 3, 2, 0, 2, 1],
                        [1, 3, 0, 3, 0, 11, 2, 0, 10, 1],
                        [1, 2, 2, 0, 2, 0, 2, 2, 2, 1],
                        [1, 3, 2, 0, 3, 0, 0, 2, 10, 1],
                        [1, 12, 0, 0, 13, 2, 3, 0, 0, 1],
                        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
                    ];

我想检查一个值是否存在,如果不存在,我想做点什么。

我有的是我根据之前的问题试过的这个功能:

public function levelTwo() {
    if(myMap.indexOf(10)==-1) {
        trace('win')
    }
}

不过我似乎无法让它工作。我 运行 游戏后,它正在追踪 'win'。

因为 myMap 是一个二维数组(数组的数组),你必须检查 myMap 中的每个数组,而不是只检查 myMap:

根据评论编辑:如果你想持续检查数组,你会想要添加一个ENTER_FRAME监听器到stage,这个将导致 levelTwo 被称为 "on tick."

stage.addEventListener(Event.ENTER_FRAME, levelTwo);    

public function levelTwo($event:Event) { // need to accept an event argument
    var found:Boolean = false;
    for each(var arr:Array in myMap)
    {
        if(arr.indexOf(10)!= -1) {
            found = true;
        }
    }

    if(!found)
    {
        trace("win");
    }
}

首先,在您当前的代码中:indexOf(10) == -1 是说 10 没有 出现在数组中,因为 indexOf returns -1 如果没有值出现。你的意思是 indexOf(10) != -1 也就是说 10 确实 出现在数组中的某个索引处。但是,indexOf NOT 搜索内部数组,只搜索数组的直接值,并且由于您的 myMap 数组只包含更多数组,而不是直接包含数字,indexOf 将始终找不到数字和 return -1;这就是为什么你总是立即得到 win 的原因。您需要搜索内部数组。

Marcela 已经发布了一种方法,使用 2 个循环。

你也可以这样做,更简洁一点:

if(array2d.some(function(array:Array, ...args):Boolean {
    return array.indexOf(10) != -1;
})){
    // found '10'
}

回调可以写成可重复使用的闭包,像这样:

function arrayHasValue(value:*):Function {
    return function(a:Array, i:int, a2d:Array):Boolean {
        return a.indexOf(value) != -1;
    }
}
// usage:
if(arr.some(arrayHasValue(8))){
    // found '8'
}
if(arr.some(arrayHasValue(3))){
    // found '3'
}

当然,您可能应该只封装您在函数中使用的任何解决方案,例如:

function myMapContains(value:int):Boolean {
    for(var i:int = 0; i < myMap.length; i++){
        for(var ii:int = 0; ii < myMap[i].length; ii++){
            if(myMap[i][ii] === value)
                return true;
        }
    }
    return false;
}
// usage
if(myMapContains(10)){
    // found '10'
}

但值得一提的是,由于您的地图是网格,因此不需要二维数组。您可以使用平面数组,而不是通过 map[row][column] 查找元素,而是通过 map[row * numColumns + column] 查找元素。使用平面数组可以轻松找到一个值:map.indexOf(value).