【问题标题】:How do I separate an integer into separate digits in an array in JavaScript?如何在 JavaScript 的数组中将整数分隔成单独的数字?
【发布时间】:2012-04-12 10:35:09
【问题描述】:

这是我目前的代码:

var n = 123456789;
var d = n.toString().length;
var digits = [];
var squaredDigits = [];
for (i = d; i >= 1; i--) {
    var j = k / 10;
    var r = (n % k / j) - 0.5;
    var k = Math.pow(10, i);
    var result = r.toFixed(); 
    digits.push(result);
}

console.log(digits);

但是当我运行我的代码时,我得到了这个:[9, 1, 2, 3, 4, 5, 6, 7, 8]

如果有人能看到问题或找到更好的解决方案,我将不胜感激!

【问题讨论】:

    标签: javascript arrays digits


    【解决方案1】:

    这实际上是我认为最干净的解决方案。

      var n =  123456789;
      const digits = (`${n}`).split('')
    

    你把它放在一个字符串文字中,但它被保存为数字,然后它被拆分为一个数组并分配给数字。

    【讨论】:

      【解决方案2】:

      假设值为n

      const n = 123456789
      

      如果您愿意,可以提供一个最小的 ES6 版本:

      String(n).split("").map(Number)
      

      一个更短但可读性更差的版本:

      [...String(n)].map(Number)
      

      想要更短(但可读性更差)?

      [...`${n}`].map(Number)
      

      你说的更短(而且基本上难以辨认)!?

      [...""+n].map(Number)
      

      现在你是真正的程序员了,恭喜!

      旁注

      因为您分配的是 2 个数组而不是 1 个数组,所以这些并不是真正有效的(就像这个线程中的大多数情况一样)。想要更高效吗?试试这个只分配一个数组:

      var arr = []
      var str = String(n)
      for (var i = 0; i < str.length; i++) {
        arr.push(Number(str[i]))
      }
      

      老派但更高效,huzzah!

      【讨论】:

        【解决方案3】:
        var n = 38679;
        var digits = n.toString().split("");
        console.log(digits);
        

        现在数字 n 被除以它的位数,它们呈现在一个数组中,并且该数组的每个元素都是字符串格式。要将它们转换为数字格式,请执行以下操作:

        var digitsNum = digits.map(Number);
        console.log(digitsNum);
        

        或者获取一个数组,所有元素从头开始都是数字格式的:

        var n = 38679;
        var digits = n.toString().split("").map(Number);
        console.log(digits);
        

        【讨论】:

          【解决方案4】:

          假设,

          let a = 123456
          

          首先我们将其转换为字符串,然后应用 split 将其转换为字符数组,然后对其进行映射以将数组转换为整数。

          let b = a.toString().split('').map(val=>parseInt(val))
          console.log(b)
          

          【讨论】:

          • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
          【解决方案5】:

          在 ES2015 中使用字符串插值进行更新。

          const num = 07734;
          let numStringArr = `${num}`.split('').map(el => parseInt(el)); // [0, 7, 7, 3, 4]
          

          【讨论】:

            【解决方案6】:

            您可以从您的号码中获取字符串列表,方法是将其转换为字符串,然后将其拆分为空字符串。结果将是一个字符串数组,每个字符串都包含一个数字:

            const num = 124124124
            const strArr = `${num}`.split("")
            

            或者在此基础上,映射每个字符串数字并将它们转换为Number

            const intArr = `${num}`.split("").map(x => Number(x))
            

            【讨论】:

              【解决方案7】:

              使用数组解构和字符串模板非常简短:

              const n = 12345678;
              const digits = [...`${n}`];
              console.log(digits);

              【讨论】:

                【解决方案8】:
                let input = 12345664
                const output = []
                while (input !== 0) {
                  const roundedInput = Math.floor(input / 10)
                  output.push(input - roundedInput * 10)
                  input = roundedInput
                }
                console.log(output)
                

                【讨论】:

                • 我喜欢这个答案,但我必须在最后添加 output.reverse() 才能以正确的顺序获取数字,因为我需要保持数字位置。
                【解决方案9】:
                const number = 1435;
                number.toString().split('').map(el=>parseInt(el));
                

                【讨论】:

                【解决方案10】:

                这适用于大于 0 的数字。您不需要将数字转换为字符串:

                function convertNumberToDigitArray(number) {
                    const arr = [];
                    while (number > 0) {
                        let lastDigit = number % 10;
                        arr.push(lastDigit);
                        number = Math.floor(number / 10);
                    }
                    return arr;
                }
                

                【讨论】:

                • 谢谢!!正在寻找一个不会转换为字符串 -> 数组 -> 数字数组的答案。这可能是最高效的方式,但我想它们无论如何都会是 O(n)。
                【解决方案11】:

                很简单,先用JavaScript中的toString()方法将数字转为字符串,然后用split()方法将字符串转为数组单个字符。

                比如数字是num,那么

                const numberDigits = num.toString().split('');
                

                【讨论】:

                  【解决方案12】:

                  我最终解决了这个问题:

                  const n = 123456789;
                  let toIntArray = (n) => ([...n + ""].map(Number));
                  console.log(toIntArray(n));

                  【讨论】:

                    【解决方案13】:

                    const toIntArray = (n) =&gt; ([...n + ""].map(v =&gt; +v))

                    【讨论】:

                      【解决方案14】:

                      这里有另一种方法。由于Javascript中的数字默认是不可拆分的,所以需要先将数字转换成字符串。

                      var n = 123;
                      n.toString().split('').map(Number);
                      

                      【讨论】:

                        【解决方案15】:

                        稍微修改了上面的答案。我们实际上不必显式调用“map”方法,因为它已经作为第二个参数内置在“Array.from”中。 截至MDN

                        Array.from(arrayLike[, mapFn[, thisArg]])

                        let num = 1234;
                        let arr = Array.from(String(num), Number);
                        console.log(arr); // [1, 2, 3, 4]
                        

                        【讨论】:

                        • 我喜欢它,尽管当您不打算重新分配变量时使用const 可能是合适的
                        【解决方案16】:

                        这是Nicolás Fantone 的答案的替代方案。您可能会争辩说它的可读性可能会差一些。重点是 Array.from() 可以将可选的 map 函数作为参数。由于没有创建中间数组,因此这种方式可以获得一些性能提升。

                        const n = 123456;
                        Array.from(n.toString(), (val) => Number(val)); // [1, 2, 3, 4, 5, 6]
                        

                        【讨论】:

                        • 随着越来越多的编码人员对粗箭头越来越熟悉,这种风格将变得更易于阅读。
                        【解决方案17】:

                        这个问题已经 5 年多了,但我们总是欢迎使用有效的编码/脚本方法。

                        var n = 123456789;
                        var arrayN = (`${n}`).split("").map(e => parseInt(e))
                        

                        【讨论】:

                          【解决方案18】:

                          const toIntArray = (n) =&gt; ([...n + ""].map(v =&gt; +v))

                          【讨论】:

                            【解决方案19】:
                            var num = 123456789;
                            num = num.toString(); //'123456789'
                            var digits = num.split(""); //[ '1', '2', '3', '4', '5', '6', '7', '8', '9' ]
                            

                            【讨论】:

                            • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                            【解决方案20】:

                            怎么样:

                            const n = 123456;
                            Array.from(n.toString()).map(Number);
                            // [1, 2, 3, 4, 5, 6]
                            

                            【讨论】:

                            • 很好的解决方案,清晰易懂,并利用了 ES6 特性。也是推荐功能之一here
                            • .map(Number) 很不错!
                            • 迄今为止最好的答案
                            • 喜欢这个解决方案——它迫使我对全局对象及其功能进行一些探索
                            • 谁能解释一下为什么 .map(Number) 会这样工作?
                            【解决方案21】:

                            我知道几个月前有人问过这个问题,但我对 samccone 的回答有一个更简洁的补充,但我没有代表可以添加评论!

                            代替:

                            (123456789).toString(10).split("").map(function(t){return parseInt(t)})
                            

                            考虑:

                            (123456789).toString(10).split("").map(Number)
                            

                            【讨论】:

                            • .toString(10) 中的 10 究竟做了什么?我知道它引用基数 10,但我已经在有无的情况下对其进行了测试,但找不到明显的区别。谢谢!另外,很酷的编辑。
                            • @EFH 如果未指定基数,则假定首选基数为 10。 Ref(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)
                            • 只是想在这里放一个“惊人的解决方案”。
                            • .toString(10) 指定 base 10 数字。另一个例子是 .toString(2),它指定 binary 数字。测试这两个。
                            • 另见下面@nicolás-fantone 的基于 ES6 的解决方案。 Array.from(n.toString()).map(Number);
                            【解决方案22】:

                            移动:

                            var k = Math.pow(10, i);
                            

                            上面

                            var j = k / 10;
                            

                            【讨论】:

                              【解决方案23】:
                              (123456789).toString(10).split("")
                              

                              ^^ 这将返回一个字符串数组

                              (123456789).toString(10).split("").map(function(t){return parseInt(t)})
                              

                              ^^ 这将返回一个整数数组

                              【讨论】:

                              • 这也会给出一个字符串数组......不是数字
                              • 不错!请注意 .map 在 IE 8 或更低版本中不可用。
                              • 人们会期望map(parseInt) 可以工作,但Array.map 也会使用索引和数组本身调用该函数(真的有必要吗?)所以它不会工作。
                              • 当心!有众所周知的pitfall。又一个do-not-read-documentation-but-yell-at-stupid-javascript 案例。
                              【解决方案24】:

                              为什么不这样做呢?

                              var n =  123456789;
                              var digits = (""+n).split("");
                              

                              【讨论】:

                              • 请注意,这将给出一个字符串数组......而不是数字。
                              • 好点。但从外观上看,数字将自行相乘,我相信这很好。所要做的就是小心,并可能在适当的时候使用parseInt(...,10);
                              • 问题是我想把后面的数字平方,我相信我不能用字符串做到这一点?
                              • for (var i = 0; i &lt; digits.length; i++) { digits[i] = +digits[i]; } 也会将每个值转换为整数
                              • (""+num1).split('').map(Number) 返回数字数组而不是字符串。
                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2022-08-14
                              • 1970-01-01
                              • 2016-01-01
                              • 2021-12-09
                              相关资源
                              最近更新 更多