如何将数字切成更小的数字以适合我的数组

How can I slice a number into smaller digits to fit my array

本文关键字:数字 我的 数组      更新时间:2023-09-26

我正在制作一个计数器,它将显示掷骰子的总和。目前,如果我超过 9,它会变成零。我需要将零值的数量切成一位数长的部分。所以 123 变成 1 231 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 namelist.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>");