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

时间:2016-05-08 14:29:55

标签: javascript arrays slice

我正在制作一个计数器,显示掷骰子的总和。目前,如果我超过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的新手,请在您的答案中添加代码。

5 个答案:

答案 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元素所需的listlist.length - i位是因为您希望它们的顺序相反。

这是一个展示该技术的可运行代码段:

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:-1)

只要它超过9,ValueError: too many values to unpack就会zeroValue。这是因为

undefinedvar 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)

数字到字符串的转换非常昂贵。获取数字可能会成为一些问题。所以这是一个非常简单的解决方案。我想这也一定非常快。

您可以创建一个非常简单的功能,如下所示。好吧..你可能没有选择使用箭头功能,你可能不会选择声明默认值等。但这是想法。

&#13;
&#13;
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;
&#13;
&#13;