我想为给定位置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)。
答案 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没有元素。仅仅因为i
和j
具有正确的值并不意味着您的数组在这些索引处具有元素。
在尝试阅读之前,您必须填充数组。
你很可能在这一点上思考,“我不是试图用该代码读取数组,我正试图在其中写入一个新值。”
好吧,因为引号中有i
和j
,您实际上是在尝试查找数组中"i"
和"j"
名称的属性(引用的意思是毕竟是文字字符串),而不是i
和j
索引位置的元素。
更改:
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