遍历网格的递归函数发疯了



当用户点击表格中的一个块时(见截图),我想找到所有具有相同颜色的相邻块。我正在尝试递归地执行此操作,但如果我尝试使用超过三个块,它有时会发疯,一遍又一遍地调用自己,直到程序崩溃。

据我所知,对象被添加到数组中,但不知何故,我的测试失败了,同一对象被一遍又一遍地添加。

任何关于问题可能是什么以及如何解决它的见解将不胜感激!

这是一个截图

这是当用户点击一个块时调用的函数:

var $matchArray;
$('.block').click(function () {
    $matchArray = [$(this)];
    var $colorClass;
    if ($(this).hasClass('red')) {
        $colorClass = 'red';
    } else if ($(this).hasClass('green')) {
        $colorClass = 'green';
    } else if ($(this).hasClass('blue')) {
        $colorClass = 'blue';
    } else {
        $colorClass = 'error';
    }
    findAllSameColorNeighbours($(this), $colorClass);
});

这是递归方法:

findAllSameColorNeighbours = function ($this, $colorClass) {
    $this.css('border-style', 'solid');
    //LEFT
    var $leftBlock = isLeftBlockSameColor($this, $colorClass);
    if ($leftBlock != null) {
        if (!(arrayContains($matchArray, $leftBlock))) {
            $matchArray.push($leftBlock);
            findAllSameColorNeighbours($leftBlock, $colorClass);
        }
    }
    //ABOVE
        //same as for LEFT
    //RIGHT
        //same as for LEFT
    //BELOW
        //same as for LEFT
}

这就是我如何找到邻近的细胞,就我所见,这些工作很好。每个方向都有一个:

isLeftBlockSameColor = function ($block, $color) {
    var $this = $block;
    var $tr = $this.parent().parent();
    var col = $tr.children().index($this.parent().prev());
    var $leftBlock = $this.parent().siblings().eq(col).children();
    var $blockClassMatch = $leftBlock.hasClass($color);
    if ($blockClassMatch) {
        return $leftBlock;
    }
    else {
        return null;
    }
};

这里有一些帮助方法来确定对象是否已经在数组中。我使用行和单元格的索引来创建纬度和经度。

arrayContains = function ($array, $object) {
    for (i = 0; i < Array.length; i++) {
        if (compareIndex($array[i], $object)) {
            say('true');
            return true;
        }
    };
    return false;
};
compareIndex = function ($obj1, $obj2) {
    if ((getRowIndex($obj1)) === (getRowIndex($obj2)) {
        if ((getCellIndex($obj1)) === (getCellIndex($obj2)) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
};
getCellIndex = function ($this) {
    var $tr = $this.parent().parent();
    var index = $tr.children().index($this.parent());
    return index;
};
getRowIndex = function ($this) {
    var $tr = $this.parent().parent();
    var index = $tr.index();
    return index;
};

arrayContains函数有一个bug。循环将只迭代一次,因为Array。长度等于1(我用chrome浏览器测试,但我不知道为什么)。你应该用$array.length代替。

arrayContains = function ($array, $object) {
        //for (i = 0; i < Array.length; i++) {
        for (i = 0; i < $array.length; i++) {
            if (compareIndex($array[i], $object)) {
                say('true');
                return true;
            }
        };
        return false;
    };

最新更新