【问题标题】:2D Javascript Array TypeError2D Javascript 数组类型错误
【发布时间】:2015-03-29 21:27:18
【问题描述】:

[编辑] 完整的应用程序可在:http://bit.ly/1CGZzym

我收到错误消息:

Uncaught TypeError: Cannot set property '0' of undefined

使用以下代码。我相信这是由于我没有正确声明 2D 数组的子数组,但我真的很困惑我应该在哪里声明这个。任何想法都会很棒。

// Create an array for the tiles we're about to draw
var tileArray = []

在函数之外声明。

我认为这是因为我试图在每个 [col] 中创建子元素,所以我想我需要在某处声明每个 col 编号,但我尝试的任何尝试似乎都没有工作。

function drawGrid()
        {

            // Draw diamond grid

            var col = 0;
            var row = 0;

            topTileX = (viewWidth/2);
            topTileY = 0;

            var nextX = 0;
            var nextY = 0;

            var getCols = 0;

            while (topTileX > -1)
            {

                tileArray[col][row] = new DiamondTile(topTileX, topTileY, tileWidth, true, col, row);
                tileArray[col][row].draw();

                while (tileArray[col][row].xPos + tileArray[col][row].tileWidth < (viewWidth) + tileWidth)
                {
                    col++;

                    nextX = tileArray[col-1][row].xPos + tileArray[col-1][row].tileWidth / 2;
                    nextY = tileArray[col-1][row].yPos + tileArray[col-1][row].tileHeight / 2;

                    tileArray[col][row] = new DiamondTile(nextX, nextY, tileWidth, true, col, row);
                    tileArray[col][row].draw();

                    if (col == getCols)
                            {
                                break;
                            }
                }

            row++;
            getCols = col;
            col = 0;

            topTileX = topTileX - tileWidth/2;
            topTileY = topTileY + tileHeight/2;

            }
        };

为了演示,DiamondTile函数如下:

function DiamondTile(xPos,yPos,width,interactive,myCol,myRow)
        {
            // Set x and y position for this sprite
            this.xPos = xPos;
            this.yPos = yPos;
            this.myRow = myRow;
            this.myCol = myCol;

            // Used for AI pathfinding
            this.isObstacle = false;
            this.isStart = false;
            this.isEnd = false;

            this.gValue = 0;
            this.hValue = 0;
            this.fCost = 0;

            this.tileWidth = width;
            this.tileHeight = this.tileWidth/2;

            var self = this;

            // Create sprite
            this.spriteObj = new PIXI.Sprite(grass);
            this.spriteObj.interactive = interactive;

            this.spriteObj.anchor = new PIXI.Point(0.5,0);

            this.spriteObj.hitArea = new PIXI.Polygon([
                new PIXI.Point(0,0),
                new PIXI.Point(100,50),
                new PIXI.Point(0,100),
                new PIXI.Point(-100,50)
                ]);

            this.spriteObj.mouseover = function()
            {
                if (self.spriteObj.tint == 0xFFFFFF)
                {
                self.spriteObj.tint = 0xA7E846;
                }

                text2.setText(self.myCol + "," + self.myRow + " Start: " + self.isStart);
            }
            this.spriteObj.mouseout = function()
            {
                if (self.spriteObj.tint == 0xA7E846)
                {
                self.spriteObj.tint = 0xFFFFFF;
                }
            }
            this.spriteObj.click = function()
            {
                if (startStage === true)
                {
                    startStage = false;
                    self.isStart = true;
                    self.spriteObj.tint = 0x1AFF00;
                    text.setText("Now select an end point");
                    endStage = true;
                    return true;
                }
                if (endStage === true)
                {
                    endStage = false;
                    self.isEnd = true;
                    self.spriteObj.tint = 0xFF0000;
                    text.setText("Now place some obstacles");
                    obsStage = true;
                    return true;
                }
                if (obsStage ===true)
                {
                    self.isObstacle = true;
                    self.spriteObj.tint = 0x3B3B3B;
                    text.setText("Press 'C' to calculate path");
                    return true;
                }

            }


        };

【问题讨论】:

  • 你在哪里设置tileArray
  • 作为全局变量。它需要所有功能都可以访问。
  • 我真的想知道你是如何创建它的,根据下面的答案。
  • 我在别处只有// Create an array for the tiles we're about to draw var tileArray = [];

标签: javascript arrays undefined multidimensional-array typeerror


【解决方案1】:

那是一个多维数组,你没有正确初始化第一维数组。在 while 循环中,您必须初始化第一个维度才能访问具有索引的第二个维度元素:

while (topTileX > -1)
{
    if (tileArray[col] == null)
        tileArray[col] = [];

    tileArray[col][row] = new DiamondTile(topTileX, topTileY, tileWidth, true, col, row);
    tileArray[col][row].draw();

    // omitted other code for brevity
}

Javascript 数组是动态的,在这种情况下初始化第一维数组元素就足够了。您不必初始化第二维中的各个项目。

更新:这里有一个工作代码http://jsfiddle.net/0qbq0fts/2/

此外,您的语义是错误的。按照书本,二维数组的第一个维度应该是行,第二个维度应该是列。

【讨论】:

  • 谢谢。这一切似乎都是有道理的,但出于某种原因。错误仍在抛出。你是绝对正确的:col/row 顺序。我会整理好的。错误被抛出:tileArray[col][row] = new DiamondTile(nextX, nextY, tileWidth, true, col, row);。尽管添加了代码来初始化子数组。设置了一些断点后,它发生在第一次迭代中。
  • 可能问题出在 DiamondTile 构造函数中。你也可以分享那个代码吗?
  • 完成。我已将其添加到主要问题中。
  • 我在回复中添加了一个 jsFiddle。 While 循环中的代码运行良好,所以问题肯定出在其他地方。
  • 在第二个循环中访问 tileArray 之前,您应该从我的响应中添加相同的检查和初始化代码,因为在其中您正在递增 col 变量。
【解决方案2】:

您必须显式创建表示第二维的元素,例如:

function make2DArray(rows, cols) {
    var r = Array(rows);
    for (var i = 0; i < rows; ++i) {
        r[i] = Array(cols);
    }
    return r;
}

如果你事先不知道有多少列,就用这个:

function make2DArray(rows) {
    var r = Array(rows);
    for (var i = 0; i < rows; ++i) {
        r[i] = [];
    }
    return r;
}

每一行都可以有独立的长度,并且会随着您向它们添加值而增长。

同样,如果您只需要添加一个新的(空)行,您可以这样做:

tileArray.push([]);

【讨论】:

  • Alnitak - 谢谢。但是,除非我误解了 - 您的代码需要预先知道要创建多少行和列。不幸的是,在第一行的最后一列被渲染之前,我们不知道要创建多少列。同样,在最后一行的第一列被渲染之前,我们不知道要创建多少行。从这个意义上说,我不能提前声明每个维度应该有多少元素。也就是说,答案作为解释问题原因的一种手段很有用。谢谢。
  • @JordanDolan 查看更新。最终重要的是每个新行条目本身必须是一维数组,您可以继续添加它们。
【解决方案3】:

这可能应该给我一个评论,但我这边已经崩溃了。 JavaScript 可能会在您声明的行上抛出异常,但问题可能出在“DiamondTile”函数上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2015-09-16
    • 2014-03-27
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多