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)
.
我有一个数组:
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)
.