创建新数组时未捕获TypeError,使用alert检查值

时间:2017-10-29 18:02:01

标签: javascript arrays

我想为给定位置i j的给定骑士创建一个相对可能的棋盘位置数组,这是棋盘的坐标。但我不明白为什么会出现这个错误:

"javascript.js:243 Uncaught TypeError: Cannot set property 'i' of undefined"

第二个键是字面意思,因此需要引用。 目前的使用是下面代码的8倍,但我想将代码重新排列为for循环,而不是写出如此多的规则。

tmpi = i + 2;
tmpj = j + 1;

if(isInBoard(tmpi,tmpj) && (board[tmpi][tmpj] == "" || board[tmpi][tmpj] < 100)){

alert('Geen pat door ' + veld(i,j) + ' stuk: ' + getStukNaam(board[i][j]));
                                return false; // paard...nog schaak(mat) test nodig!

                            }



tmpij.length = 0; // empty tmp array....

alert(i + "+" + j); // does work.

//mpij[] = [i + 2,j + 1];

tmpij[0]['i'] = i + 2; // not working
tmpij[0]['j'] = j + 1;
tmpij[1]['i'] = i + 1;
tmpij[1]['j'] = j + 2;
tmpij[2]['i'] = i - 1;
tmpij[2]['j'] = j + 2;
tmpij[3]['i'] = i - 2;
tmpij[3]['j'] = j + 1;
tmpij[4]['i'] = i - 2;
tmpij[4]['j'] = j - 1;
tmpij[5]['i'] = i - 1;
tmpij[5]['j'] = j - 2;
tmpij[6]['i'] = i - 2;
tmpij[6]['j'] = j + 1;
tmpij[7]['i'] = i - 1;
tmpij[7]['j'] = j + 2;

for (counter = 0, len = tmpij.length; counter < len; counter++) {
    alert("testtxt ij: " + tmpij[counter]['i'] + tmpij[counter]['j']);
}

我检查了i和j的值。在我目前的测试中,此警报显示:2 + 2.(正确值)。 tmpij数组在循环中使用,但在函数的开头启动,如:tmpij []。因此,在循环中我必须在每次新测试之前清空它。

yessssssssssssss:这有效:

tmpij[0] = [];
tmpij[0]['i'] = i + 2; 
tmpij[0]['j'] = j + 1;
alert("[0]: " + tmpij[0]['i'] + tmpij[0]['j']);

起始值2和2,结果是4和3,这确实是寻找的字段(i + 2和j + 1)。

1 个答案:

答案 0 :(得分:2)

在我们解决您的语法错误之前,您必须了解技术上,JavaScript没有多维数组。你可以做的只是将数组存储在数组中的索引位置。

因此,如果索引位置[0][0]尚未存储数组,则无法在索引位置0创建元素。

例如:

var arrayOne = [];

arrayOne[0] = 42;
arrayOne[0][0] = "Will not work as expected";

console.log(arrayOne[0][0]);

// ********************************************

var arrayTwo = [];

arrayTwo[0] = [];  // You must store an array in the first dimension to have a second
arrayTwo[0][0] = "Will work as expected";

console.log(arrayTwo[0][0]);

现在,这一行:

tmpij.length = 0; // empty tmp array....

清除你的数组(正如你自己的评论所示)。

这一行(及其后的其他行):

tmpij[0]['i'] = i + 2;

失败,因为数组中的位置0没有元素。仅仅因为ij具有正确的值并不意味着您的数组在这些索引处具有元素。

在尝试阅读之前,您必须填充数组。

你很可能在这一点上思考,“我不是试图用该代码读取数组,我正试图在其中写入一个新值。”

好吧,因为引号中有ij,您实际上是在尝试查找数组中"i""j"名称的属性(引用的意思是毕竟是文字字符串),而不是ij索引位置的元素。

更改:

tmpij[0]['i'] = i + 2;
tmpij[0]['j'] = j + 1;

为:

tmpij[0][i] = i + 2;
tmpij[0][j] = j + 1;

将更改操作从尝试读取名称为"i""j"的Array的属性到写入i和{{1}索引的数组中的元素}。

但是,如前所述,如果第一个维度不存储数组,则无法获得第二个维度。您必须确保第一个设置正确:

j