当我调用下面的图形函数时,当我只想要4对单独的2位数时,它会像一千个数字一样呕吐。我在s变量中定义了一个数字然后把它们加到图形函数中。出什么问题了?例如,我想要的一个数字是这样的:
12 34 54 72
但是我得到了这个:
13694846 894846 7846 26
var s1 = Math.floor(Math.random() * 8 + 1);
var s2 = Math.floor(Math.random() * 8 + 1);
var s3 = Math.floor(Math.random() * 8 + 1);
var s4 = Math.floor(Math.random() * 8 + 1);
var s5 = Math.floor(Math.random() * 8 + 1);
var s6 = Math.floor(Math.random() * 8 + 1);
var s7 = Math.floor(Math.random() * 8 + 1);
var s8 = Math.floor(Math.random() * 8 + 1);
var lives = 3;
var time = 5000;
function figure(a1, a2, a3 ,a4, a5, a6, a7, a8){
var all = a1 + "" + a2 + "" + a3 + "" + a4 + "" + a5 + "" + a6 + "" + a7 + "" + a8;
var als = String(all);
var p1 = als.substring(0);
var p2 = als.substring(1);
var p3 = als.substring(2);
var p4 = als.substring(3);
var p5 = als.substring(4);
var p6 = als.substring(5);
var p7 = als.substring(6);
var p8 = als.substring(7);
var n1 = Number(p1);
var n2 = Number(p2);
var n3 = Number(p3);
var n4 = Number(p4);
var n5 = Number(p5);
var n6 = Number(p6);
var n7 = Number(p7);
var n8 = Number(p8);
var g1 = n1 + n2;
var g2 = n3 + n4;
var g3 = n5 + n6;
var g4 = n7 + n8;
console.log(g1 + " " + g2 + " " + g3 + " " + g4);
}
figure(s1, s2, s3 ,s4, s5, s6, s7, s8);
你的代码有两个主要问题:
-
你正在调用
.substring()
方法,只有一个开始索引,这意味着它从该索引中选择一个子字符串,直到字符串的末尾。你需要指定一个结束索引,比如var p1 = als.substring(0,1);
,或者如果你只想要一个字符,就用.charAt()
代替。 -
在添加它们之前,您不需要将字符串转换为数字,因为您似乎想要使用
"1"
和"2"
并获得"12"
,但如果将它们转换为数字,您将获得1 + 2
,即3
。所以把Number()
去掉
作为题外话,你可以替换这个:
var all = a1 + "" + a2 + "" + a3 + "" + a4 + "" + a5 + "" + a6 + "" + a7 + "" + a8;
var als = String(all);
…用这个:
var als = "" + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
…因为如果你以字符串开头任何你加进去的数字都会自动转换成字符串。这些行可以工作,但是比需要的要复杂得多。
在以下折叠的代码片段中,我对现有代码进行了上述更改,但其余部分保持原样-如果展开代码片段并单击"运行"按钮,您可以看到它正在工作:
var s1 = Math.floor(Math.random() * 8 + 1);
var s2 = Math.floor(Math.random() * 8 + 1);
var s3 = Math.floor(Math.random() * 8 + 1);
var s4 = Math.floor(Math.random() * 8 + 1);
var s5 = Math.floor(Math.random() * 8 + 1);
var s6 = Math.floor(Math.random() * 8 + 1);
var s7 = Math.floor(Math.random() * 8 + 1);
var s8 = Math.floor(Math.random() * 8 + 1);
var lives = 3;
var time = 5000;
function figure(a1, a2, a3 ,a4, a5, a6, a7, a8){
var als = "" + a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
var p1 = als.charAt(0);
var p2 = als.charAt(1);
var p3 = als.charAt(2);
var p4 = als.charAt(3);
var p5 = als.charAt(4);
var p6 = als.charAt(5);
var p7 = als.charAt(6);
var p8 = als.charAt(7);
var g1 = p1 + p2;
var g2 = p3 + p4;
var g3 = p5 + p6;
var g4 = p7 + p8;
console.log(g1 + " " + g2 + " " + g3 + " " + g4);
}
figure(s1, s2, s3 ,s4, s5, s6, s7, s8);
但是你会注意到你有很多重复的代码。如果您使用数组来保存类似的值,并通过循环操作它们,那么您就不需要重复这么多。下面是一个非常简单的例子,可以得到相同的结果:
var randomDigits = [];
for (var i = 0; i < 8; i++) {
// the array .push()` method adds an item to the end of the array
randomDigits.push(Math.floor(Math.random() * 8 + 1));
}
function figure(digits) {
var groups = [];
for (var i = 0; i < 8; i += 2) {
groups.push("" + digits[i] + digits[i + 1]);
}
console.log(groups);
console.log(groups.join(" "));
}
figure(randomDigits);
(如果它是我的代码,我可能会做进一步的结构更改,但作为一个起点,我只是想向您展示一种简单的方法来获取您所拥有的并将其转换为使用数组。)
前面的答案解决了你的问题。然而,如果您只想生成4个2位数的数字,那么像这样的解决方案更方便:
var ss = [];
for (var idx = 0; idx < 8; idx ++) {
var s = Math.floor(Math.random() * 8 + 1)
ss.push (s);
}
function figure (as) {
var gs = [];
for (var idx = 0; idx < as.length; idx+=2)
if (idx%2===0) gs.push (
as[idx] * 10 + as[idx + 1]
);
return gs;
}
console.log (
figure f(ss)
);