如何将数字切成更小的数字以适合我的数组
How can I slice a number into smaller digits to fit my array
我正在制作一个计数器,它将显示掷骰子的总和。目前,如果我超过 9,它会变成零。我需要将零值的数量切成一位数长的部分。所以 123 变成 1 23, 1 2 3, 123。这样它就可以适合我的阵列。我尝试了这样的事情:
function diceResult(){
var whichNumber = 123; // this number will change, depending on sum of dice rolled
var getTextNumber = new Array (9)
getTextNumber[0] = "zero";
getTextNumber[1] = "one";
getTextNumber[2] = "two";
getTextNumber[3] = "three";
getTextNumber[4] = "four";
getTextNumber[5] = "five";
getTextNumber[6] = "six";
getTextNumber[7] = "seven";
getTextNumber[8] = "eight";
getTextNumber[9] = "nine";
var zeroValue = getTextNumber[whichNumber];
var getZero = diceToolbarCounterWrapper.getElementsByTagName("li");
getZero[2].className = zeroValue.slice(2, -0; /* <------ I tried this */
getZero[1].className = zeroValue.slice(1, -1);
getZero[0].className = zeroValue.slice(0, -1);
};
不幸的是,这不起作用。这样做的另一个问题是,如果数字长度低于 3 位,则会删除太多数字。如果掷骰子的总和为 123,这就是我想发生的事情:
getZero[2].className = "one";
getZero[1].className = "two";
getZero[0].className = "three";
我怎样才能做到这一点?请在您的答案中添加代码,因为我是javaScript的新手。
您可以逐个字符浏览字符串并执行所需的操作
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]));
}
一种可能性是拆分数字:
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]
如果您为变量提供有意义的名称,它可能会帮助您了解正在发生的事情。如果这样做,代码的读取方式如下:
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
数组,在所需的list
元素上设置所需的class name
。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/>");
就目前而言zeroValue
只要超过 9 就会被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 = "";
}
};
编辑:要解决向后定位问题,您可以将其重写为:
for (i = splitNumber.length - 1; i >= 0; i--) {
getZero[3 - splitNumber.length + i].className = getTextNumber[splitNumber[i]];
}
if (splitNumber.length === 1) {
getZero[0].className = "";
getZero[1].className = "";
}
if (splitNumber.length === 2) {
getZero[0].className = "";
}
数字到字符串的转换非常昂贵。对于某些人来说,取出数字可能会成为一个问题。所以这是一个非常简单的解决方案。我想这也一定非常非常快。
您可以创建一个非常简单的函数,如下所示。好吧。。。您不能选择使用箭头函数,也不能选择声明默认值等。但这是想法。
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>");
- 我如何在数字插入中使用逗号,这样它就不会'不要破坏我的输入字段
- 我的角度形式输入[数字]验证不起作用
- 如何将数字切成更小的数字以适合我的数组
- 当与另一个实例进行比较时,我的类实例如何隐式返回数字
- 在我的网站上创建一个在1-10之间不断变化的数字时遇到了问题.Javascript
- 我如何才能在点击按钮时将我的数字和财富显示在这个脚本上
- 如何使我的数字刻度对滚动和单击做出响应
- 我的数字检查器功能不起作用,为什么
- 我无法让我的javascript数字分类器工作
- 我希望在我的html文档中更改一个数字,但是通过使用javascript
- JavaScript for-loop:如何让我的数字转换器工作
- 我的视图模型不会根据 JSON 结果淘汰来增加数字
- 我的正则表达式与数字不匹配
- 为什么我的数字 .val() 变成了字符串
- 数字键盘与我的计算器一起工作
- Javascript 简单检查网络表单,以确保它包含数字和字母(而不是我的代码)
- 为什么我的 array.length 返回这么高的数字
- 试图让我的 JavaScript 计算出输入的 2 个数字,以便通过 pc 进行计算
- 用带淘汰的前导零格式化我的数字
- 尝试通过AJAX发送数字,然后将它们添加到我的数据库中