在我的JavaScript小程序中,我必须检查a和b输入值:如果它们是新对,则该对将作为一维向量添加到小程序的历史记录中。
因此,我制作了一个History 2D数组,其中存储了所有新对。该程序循环比较新对和历史记录阵列的每一行的阵列。但是,我遇到了麻烦:当比较的结果应该为真时(即,当i == 1时),我得到的是错误的结果。
我阅读了以下基本页面: https://www.w3schools.com/js/js_arrays.asp 以及其他几个网页,没有找到造成我麻烦的原因。
此主题似乎在谈论另一个问题(但是,与我的问题有关): Convert a 2D JavaScript array to a 1D array
我曾尝试与==和===运算符进行比较,但两种情况均未成功。
我猜我的错误是一个小错误,但是我有几个小时试图解决它而没有成功(我是Java语言的新手。)
var history = [[1, 1], [1, 2]];
var numA = 1;
var numB = 2;
var currentPair = [numA, numB];
var isRepeatedPair = false;
var i = 0;
while ((i < history.length) && (isRepeatedPair == false)) {
isRepeatedPair = (currentPair === history[i]);
// alert("i= " + i + "\n" + "Current pair: " + currentPair + "\n" + "Pair in history: " + history[i]+ "\n" + "Is repeated pair? " + isRepeatedPair);
i = i + 1;
}
history.push(currentPair);
当比较结果为真时(即,当i == 1时),我得到错误的结果。
(我已经使用以下命令对此进行了检查:
alert("i= " + i + "\n" + "Current pair: " + currentPair + "\n" + "Pair in history: " + history[i]+ "\n" + "Is repeated pair? " + isRepeatedPair);
在循环的每个步骤中;在MRE中此行被禁用。)
答案 0 :(得分:1)
您可以使用其他名称history
,因为这是window.history
的保留变量。
然后更改循环并仅检查长度,如果发现重复项并设置标志isRepeatedPair
,则退出循环。
检查必须比较每个元素,因为相等的数组在共享相同对象引用的情况下实际上是相同的。如果只有值,则需要检查这些值。
最后,再次检查标志,如果为false
,则将实际的配对推入历史记录。
var historyX = [[1, 1], [1, 2]],
numA = 1,
numB = 2,
currentPair = [numA, numB],
isRepeatedPair = false,
i = 0;
while (i < historyX.length) {
if (currentPair[0] === historyX[i][0] && currentPair[1] === historyX[i][1]) {
isRepeatedPair = true;
break;
}
i++;
}
if (!isRepeatedPair) {
historyX.push(currentPair);
}
console.log(historyX);