繁体   English   中英

JavaScript二维数组未返回正确的值

[英]javascript 2 dimensional array does not return the correct value

我正在测试剪刀石头蜥蜴spock游戏。 我没有产生可能的结果,而是使用var matrix = [ ]来捕获所有可能性。 在数组位置matrix[3,0] ,输入的字符串为“ rock wins”。 但是,我在数组之后立即运行console.log(matrix[3,0]) ,它产生了不同的结果。

有人可以告诉我为什么吗?

var matrix = [];

matrix[0,0] = "it's a tie";
matrix[0,1] = "Paper wins";
matrix[0,2] = "rock wins";
matrix[0,3] = "rock wins";
matrix[0,4] = "Spock wins";
matrix[1,0] = "Paper wins";
matrix[1,1] = "it's a tie";
matrix[1,2] = "Scissors win";
matrix[1,3] = "Lizard wins";
matrix[1,4] = "Paper wins";
matrix[2,0] = "rock wins";
matrix[2,1] = "Scissors win";
matrix[2,2] = "it's a tie";
matrix[2,3] = "Scissors win";
matrix[2,4] = "spock wins";
matrix[3,0] = "rock wins";

log.console(matrix[3,0]); //returns spock wins 

不,不是的。 它实际上返回“摇滚胜利”。
简而言之,您使用了不正确的语法。

为什么会发生?

您可能会错过这部分,然后直接转到“应该如何?” 如果您对了解JavaScript的神奇行为不感兴趣。

  1. 您已声明一数组。
  2. 当您尝试分配或读取以下属性matrix[0,0]0,0被识别为一个表达式该表达式的值等于最后一个数字(在这种情况下为0)。

这意味着

matrix[0,0] = "it's a tie";
matrix[0,1] = "Paper wins";
matrix[0,2] = "rock wins";
// ...
matrix[2,3] = "Scissors win";
matrix[2,4] = "spock wins";
matrix[3,0] = "rock wins";
console.log(matrix[3,0]);

是相同的

matrix[0] = "it's a tie";
matrix[1] = "Paper wins";
matrix[2] = "rock wins";
// ...
matrix[3] = "Scissors win";
matrix[4] = "spock wins";
matrix[0] = "rock wins";
console.log(matrix[0]); // returns "rock wins"

在此StackOverflow主题中阅读有关它的更多信息。

原因是您使用了错误的语法。

应该怎么办

这就是您在JavaScript中访问多维数组中的值的方式:

var val = arr[key1][key2][key3]; // not arr[key1, key2, key3]

这就是您的代码的外观:

 var matrix = []; for (var i = 0; i < 4; i++) matrix[i] = []; matrix[0][0] = "it's a tie"; matrix[0][1] = "Paper wins"; matrix[0][2] = "rock wins"; // ... matrix[2][3] = "Scissors win"; matrix[2][4] = "spock wins"; matrix[3][0] = "rock wins"; document.write(matrix[3][0]); // not matrix[3,0] 

另一个不错的选择是用这种方式描述2D数组:

var matrix = [
    ["it's a tie", "Paper wins", "rock wins"],
    ["Paper wins", "it's a tie", "Scissors wins"]
    // ...     
];

在您的代码中:

matrix[0,0] = "it's a tie";

方括号中的部分是一个表达式,该表达式被求值并强制为字符串。 表达式0,0返回最后一个“,”之后的值,并求0 0,1求值为1,依此类推。

所以:

var matrix = [];

matrix[0,0] = "it's a tie";
matrix[0,1] = "Paper wins";
matrix[0,2] = "rock wins";
matrix[0,3] = "rock wins";
matrix[0,4] = "Spock wins";
matrix[1,0] = "Paper wins";
matrix[1,1] = "it's a tie";
matrix[1,2] = "Scissors win";
matrix[1,3] = "Lizard wins";
matrix[1,4] = "Paper wins";
matrix[2,0] = "rock wins";
matrix[2,1] = "Scissors win";
matrix[2,2] = "it's a tie";
matrix[2,3] = "Scissors win";
matrix[2,4] = "spock wins";
matrix[3,0] = "rock wins";

创建分配给每个索引的最后一个值的“一维”数组:

["rock wins", "Scissors win", "it's a tie", "Scissors win", "spock wins"]

matrix[3,0] 

评估为

matrix[0]

因此,您将获得“摇滚胜利”。

您想要的是:

var matrix = [[],[],[],[]];

matrix[0][0] = "it's a tie";
matrix[0][1] = "Paper wins";
matrix[0][2] = "rock wins";
matrix[0][3] = "rock wins";
matrix[0][4] = "Spock wins";
matrix[1][0] = "Paper wins";
matrix[1][1] = "it's a tie";
matrix[1][2] = "Scissors win";
matrix[1][3] = "Lizard wins";
matrix[1][4] = "Paper wins";
matrix[2][0] = "rock wins";
matrix[2][1] = "Scissors win";
matrix[2][2] = "it's a tie";
matrix[2][3] = "Scissors win";
matrix[2][4] = "spock wins";
matrix[3][0] = "rock wins";

console.log(matrix[3][0]); // rock wins

您还可以使用数组文字:

var matrix = [
              ["it's a tie","Paper wins","rock wins","rock wins","Spock wins"],
              ["Paper wins","it's a tie","Scissors win","Lizard wins","Paper wins"],
              ["rock wins","Scissors win","it's a tie","Scissors win","spock wins"],
              ["rock wins"]
             ];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM