我正在制作一个计数器,显示掷骰子的总和。目前,如果我超过9,它变成零。我需要将 zeroValue 的数量切成一个长的数字。所以123变为1 23 , 1 2 3 , 12 3.这样它就适合我的阵列。我试过这样的事情:
getZero[2].className = "one";
getZero[1].className = "two";
getZero[0].className = "three";
不幸的是,这不起作用。另一个问题是,如果数字长度低于3位,则会删除太多数字。如果骰子的总和是123,那就是我想要发生的事情:
{
"name":"Tim",
"age":19
}
,{
"name":"Jim",
"age":20
}
,{
"name":"Will",
"age":21
}
,{
"name":"Ed",
"age":22
}
我怎样才能做到这一点?因为我是javaScript的新手,请在您的答案中添加代码。
答案 0 :(得分:1)
一种可能性是分割数字:
function splitNum (n) {
var digits = [n % 10];
n = Math.floor(n / 10);
return n == 0 ? digits : (
splitNum(n).concat(digits)
);
}
splitNum(0) // [0]
splitNum(1) // [1]
splitNum(12) // [1, 2]
然后用几个零填充数组:
function zeroPad (n, digits) {
var zeros = new Array(n);
while (n--) zeros[n] = 0;
return zeros.concat(digits);
}
digits = splitNum(12); // [1, 2]
zeros = 3 - digits.length; // 1
digits = zeroPad(zeros, digits); // [0, 1, 2]
虽然有一条捷径(ninjavascript):
num = 12 + ""; // "12"
num = new Array(4 - num.length).join("0") + num; // "012"
digits = num.split(""); // ["0", "1", "2"]
digits = digits.map(Number); // [0, 1, 2]
答案 1 :(得分:0)
您可以逐字逐句查找字符串并执行您需要的操作
var num = 123;
var str_num = num.toString();
for(var i = 0; i < str_num.length ; i++){
console.log(str_num[i]);
// if you need int
console.log(parseInt(str_num[i]));
}
答案 2 :(得分:0)
如果您为变量提供有意义的名称,它可能会帮助您了解正在发生的事情。以下是您执行此操作时代码的读取方式:
function diceResult(){
var roll = 123; // this number will change, depending on sum of dice rolled
var words= new Array (9)
words[0] = "zero";
words[1] = "one";
words[2] = "two";
words[3] = "three";
words[4] = "four";
words[5] = "five";
words[6] = "six";
words[7] = "seven";
words[8] = "eight";
words[9] = "nine";
var word = getTextNumber[num];
var list = diceToolbarCounterWrapper.getElementsByTagName("li");
list[2].className = word.slice(2, -0; /* <------ I tried this */
list[1].className = word.slice(1, -1);
list[0].className = word.slice(0, -1);
};
}
现在你应该能够看到你正在切断错误的东西。您希望使用roll
中的一个数字作为words
的索引。有很多方法可以从你的号码中获取数字,但这是最简单的
(roll + '').split('')
这会获取您的号码并将其转换为string
(通过将其添加到字符串中),然后将其拆分为字符串数组。
现在您需要使用parseInt()
来获取用于取消引用数组的值,因此您最终会得到:
var nums = (roll+ '').split('')
list[2].className = words[parseInt(nums[0])];
list[1].className = words[parseInt(nums[1])];
list[0].className = words[parseInt(nums[2])];
当然,你仍然有处理两位数而不是三位数,或者甚至四位或更多位数的问题,所以这就变成了这个:
var index = (roll + '').split('');
for(i = 0; i < index.length; i++)
list[i].className = words[parseInt(index[list.length - i])];
这会在index
数组中循环设置您需要的class name
元素所需的list
。 list.length - i
位是因为您希望它们的顺序相反。
这是一个展示该技术的可运行代码段:
var roll = 43; // this number will change, depending on sum of dice rolled
var words = new Array (9);
words[0] = "zero";
words[1] = "one";
words[2] = "two";
words[3] = "three";
words[4] = "four";
words[5] = "five";
words[6] = "six";
words[7] = "seven";
words[8] = "eight";
words[9] = "nine";
var index = (roll + '').split('');
document.write("<p>Here's the array containing the digits of the roll: [" + index + "]</p><p>And the classes follow</p>");
for(i = 0; i < index.length; i++)
document.write(words[parseInt(index[index.length - 1 - i])] + "<br/>");
&#13;
答案 3 :(得分:-1)
只要它超过9,ValueError: too many values to unpack
就会zeroValue
。这是因为
undefined
和
var getTextNumber = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
。
在进行查找之前,您需要拆分getTextNumber[123] === undefined // true
。这将变得很长,例如whichNumber
等等。我建议使用var whichNumber1 = whichNumber.toString().slice(0,1)
:
split
编辑:要解决向后定位问题,您可以将其重写为:
function diceResult(){
var whichNumber = getSumDiceValue(); //sum of dice rolled.
var getTextNumber = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
var splitNumber = whichNumber.toString().split(""); // ["1", "2", "3"]
var getZero = diceToolbarCounterWrapper.getElementsByTagName("li");
getZero[0].className = getTextNumber[splitNumber[0]];
if (splitNumber.length > 1) {
getZero[1].className = getTextNumber[splitNumber[1]]
} else {
getZero[1].className = "";
}
if (splitNumber.length > 2) {
getZero[2].className = getTextNumber[splitNumber[2]];
} else {
getZero[2].className = "";
}
};
答案 4 :(得分:-1)
数字到字符串的转换非常昂贵。获取数字可能会成为一些问题。所以这是一个非常简单的解决方案。我想这也一定非常快。
您可以创建一个非常简单的功能,如下所示。好吧..你可能没有选择使用箭头功能,你可能不会选择声明默认值等。但这是想法。
var getArr = (n, h = Math.floor(n/100)%10,
t = Math.floor(n/10)%10,
o = n%10) => h != 0 ? [h].concat(t).concat(o)
: t != 0 ? [t].concat(o)
: [o];
document.write("<pre>" + JSON.stringify(getArr(7)) + "</pre>");
document.write("<pre>" + JSON.stringify(getArr(42)) + "</pre>");
document.write("<pre>" + JSON.stringify(getArr(137)) + "</pre>");
&#13;