我还在制作一个程序而且我遇到了问题。代码在这里:
function Calculate(){
var elev = [];
var inputs = document.getElementsByName("txt");
for(i=0; i<inputs.length; i++) {
elev[i] = {
"Value": inputs[i].value,
"Used": false
};
}
for(j=0; j<=10; j++) {
var r = Math.floor(Math.random() * 20);
if (elev[r].Used) { //1st number
for(var a=0; a<=21; a++) {
if (!elev[a].Used) {
elev[r].Value = elev[a].Value;
break;
}
else {continue; }
}
}
...
}
}
elev[r].used = true;
doument.write(elev[r].Value);
...
}
}
首先,我在HTML文档中对var输入[i] .value(稍后的elev [i])进行了22次导入。我想让它使用所有'elev'数组一次,但我看到(在我的document.write中,因为我在这里修剪)它使用了一些两次,其中一些甚至没有使用。我该如何解决这个问题?
使用Fisher-Yates shuffle解决问题
答案 0 :(得分:0)
让我指出你的剧本的几个问题
首先是本节
for(i=0; i<inputs.length; i++) {
elev[i] = inputs[i].value;
elev[i].used = false;
}
您正在为数组指定值,但它的类型为String
。 String没有获取属性。
以下代码可以使用
var obj = {};
obj.SomeProp = true;
但如果你这样做
var str = "";
str.SomeProp = true;
尝试使用str.SomeProp
将始终返回undefined
代码if (elev[r].used)
将始终评估为false(因为0
,空字符串,false
,null
和undefined
在if
中表现为false JavaScript中的运算符)
所以我建议你将代码重构为
for(i=0; i<inputs.length; i++) {
elev[i] = {
"Value": inputs[i].value,
"Used": false
}; // Pay attention, I added an object and Used property starts with an uppercase letter.
// Then further in the code you'll use elev[index].Value in order to use the value
}
最后,块if (elev[aa].used = false)
不会抛出异常,但这是一个错误。
考虑以下剪切
var someVal = true;
if (someVal = false)
alert("That's wierd");
alert(someVal);
它将起作用,因为您将值false赋给someVal
变量,并且此指令被评估为true。系统会显示一些包含消息That's wierd
的提醒。此外,您会注意到someVal
的值为false
。
此snipped使用等于运算符,该运算符将被计算为false,并且第一个警报将无效。但是也存在问题。一种风格的。切勿将值检查为false,尤其是在JavaScript中。
var someVal = true;
if (someVal == false)
alert("That's wierd");
alert(someVal);
正确的代码段必须如下所示。
var someVal = true;
if (someVal)
alert("There you go!");
alert(someVal);
P.S。
您无处可获得变量aa
。它从何而来?它必须是未定义的。你想要什么?
两个数字的共同值?他们的总和?
修改
只是一些通知。
1)使用for (var a = 0; a < someConstant; a++)
语法。不要忘记添加var关键字。
2)使用适当的缩进,即
if (someCondition){
// Some instruction
for (var i = 0; i < 10; i++) {
//more indention
}
}
3)不要使用empty
else阻止。