JavaScript数字拆分成单个数字


74

我正在尝试解决一个数学问题,在该数学问题中,我将数字取为45111,然后将数字拆分为单独的数字,例如4 51 1 1。然后,我将每个数字保存到var中以运行方法。有人知道如何将数字拆分为单个数字吗?

例如,我有一个在数组上运行的循环:

for (var i = 0; i < range.length; i++) {
  var n = range[i];
}

对于每个数字,我想拆分其数字并将其加在一起吗?

Answers:


69
var number = 12354987,
    output = [],
    sNumber = number.toString();

for (var i = 0, len = sNumber.length; i < len; i += 1) {
    output.push(+sNumber.charAt(i));
}

console.log(output);

/* Outputs:
 *
 * [1, 2, 3, 5, 4, 9, 8, 7]
 */ 

更新:计算总和

for (var i = 0, sum = 0; i < output.length; sum += output[i++]);
console.log(sum);

/*
 * Outputs: 39
 */

动态地将所有数字加在一起,除此以外,数字的长度有多容易?
jonnyhitek 2011年

@jonnyhitek,对我来说工作很快— i.imgur.com/TTGZL.png — Chrome 14 @ Win7。和一个jsfiddle:jsfiddle.net/Lapple/ZmS3B
Lapple

您的浏览器可能不支持consoleAPI,请更改consolealert
Lapple

不,我认为这是我的错误,我正在尝试在循环中运行您的代码
jonnyhitek 2011年



36

您也可以以“数学”方式进行操作,而无需将数字视为字符串:

var num = 278;
var digits = [];
while (num > 0) {
    digits.push(num % 10);
    num = parseInt(num / 10);
}
digits.reverse();
console.log(digits);

我可以看到的一个好处是,您不必parseInt()在每个数字上都运行,而是将实际数字作为数值来处理。


24

这是我找到的最短的,尽管它确实将数字返回为字符串:

let num = 12345;

[...num+''] //["1", "2", "3", "4", "5"]

或使用它来获取整数:

[...num+''].map(n=>+n) //[1, 2, 3, 4, 5]

11

我将提供一个已经给出的答案的变体,以便您可以看到一种始终保留数值类型的不同方法:

var number = 12354987,
    output = [];

while (number) {
    output.push(number % 10);
    number = Math.floor(number/10);
}

console.log(output.reverse().join(',')); // 1,2,3,5,4,9,8,7

在将数字转换为罗马数字时,我已经使用了上述技术来达到良好效果,这是我开始学习我不熟悉的编程语言时最喜欢的方式之一。例如,这是我在世纪之交之后设计出一种使用Tcl将数字转换为罗马数字的方法:http : //code.activestate.com/recipes/68379-conversion-to-roman-numerals/

我的Tcl脚本中的可比较行是:

  while {$arabic} {
    set digit [expr {$arabic%10}]
    set arabic [expr {$arabic/10}]

令人遗憾的是,%运算符的首次合理使用在答案列表中如此之低
Sergey Orlov

感谢您的持续投票,但是鉴于ES5和/或ES6,此答案已不再有效。就目前情况而言,我应该已经output.unshift(而不是push)指定了这个,从而使reverse()不必要的操作(很多人都无法做到)unshift
Dexygen,

@GeorgeJempty,感谢您强调保留数字类型。昨天我花了太多时间来解决由字符串输入引起的基本转换问题。对于您可能与ES5 / ES6和/或相关的此答案的任何更新,我们将不胜感激output.unshift
CODE READ

5

// Split positive integer n < 1e21 into digits:
function digits(n) {
  return Array.from(String(n), Number);
}

// Example:
console.log(digits(1234)); // [1, 2, 3, 4]


4

您可以处理字符串而不是数字来实现此目的。你可以这样

(111 + '').split('')

这将返回一个字符串数组['1','1','1'],您可以在其上进行迭代并调用parseIntmethod。

parseInt('1') === 1

如果需要单个数字的总和,则可以使用reduce函数(从Javascript 1.8实现)

(111 + '').split('').reduce(function(previousValue, currentValue){  
  return parseInt(previousValue,10) + parseInt(currentValue,10);  
})

2

不转换为字符串:

function toDigits(number) {
    var left;
    var results = [];

    while (true) {
        left = number % 10;
        results.unshift(left);
        number = (number - left) / 10;
        if (number === 0) {
            break;
        }
    }

    return results;
}


1

每个2参数分开。

function separator(str,sep) {
    var output = '';
    for (var i = str.length; i > 0; i-=2) {
        var ii = i-1;
        if(output) {
            output = str.charAt(ii-1)+str.charAt(ii)+sep+output;
        } else {
            output = str.charAt(ii-1)+str.charAt(ii);
        }            
    }
    return output;
}
console.log(separator('123456',':')); //Will return 12:34:56

1

影子向导,Orien的扩展版本

var num:Number = 1523;
var digits:Array = [];
var cnt:int = 0;
while (num > 0) {
    var mod:int = num % 10;
    digits.push(mod * Math.pow(10, cnt))

    num = Math.floor(num / 10);
    cnt++;
}
digits.reverse();
trace(digits);

输出:1000,500,20,3


1

我使用了这种简单的方法。

分割数字

var N = 69;
var arr = N.toString().split('').map(Number)
// outputs [6,9]
console.log( arr ); 

将它们加在一起

console.log(arr.reduce( (a,b) => a+b )); // 15

1

最简单的... num_string.split('').map(Number)

请尝试以下方法:

console.log((''+123).split('').map(Number))


1

为了将整数按相同的顺序拆分成各个数字,正则表达式是我使用的首选方法,因为即使将数字转换为字符串后,它也可以防止丢失数字的身份。

下面的代码行将整数转换为字符串,使用正则表达式匹配字符串中的任何单个数字,然后返回这些数字的数组,此后该数组将映射为转换回数字。

const digitize = n => String(n).match(/\d/g).map(Number);


1

递归的有趣介绍。此答案取一个数字,并返回一个数字位数的数组。它并没有数量转换为一个字符串作为一个中间步骤。

鉴于n = 1234

  • n % 10 将返回第一个(右湿)数字, 4
  • n / 10123剩下的会回来
  • 使用Math.floor我们可以将剩余部分砍掉
  • 重复这些步骤,我们可以得出完整的结果

现在我们只需要建立递归条件,

  • 如果数字已经是一位数字(n <10),则返回该数字的数组单例
  • 否则(归纳)数为10或更大;重复并加在第一位

const digits = (n = 0) =>
  n < 10
    ? [ n ]
    : [ ... digits (Math.floor (n / 10)), n % 10 ]

console.log (digits ())        // [ 0 ]
console.log (digits (1))       // [ 1 ]
console.log (digits (12))      // [ 1, 2 ]
console.log (digits (123))     // [ 1, 2, 3 ]
console.log (digits (11234))   // [ 1, 2, 3, 4 ]

console.log (digits (123456789012))
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 ]


这确实很整洁,但并非在每种情况下都行得通。digits(123456789012)返回[-539222987, 2]
Wondercricket '19

@Wondercricket感谢您发现问题,我进行了更新以解决此问题。>>我不太了解这种行为。我想知道这是否是错误吗?
谢谢您,

离题:期待在stackoverflow.com/q/54721972/5260024上看到您的答案:)
Jonas Wilms

很酷的问题,是吗?感谢分享。看起来B已经抓住了问题:D
谢谢


0
var num = 111,
 separateDigits = num.toString().split(""), i, l = separateDigits.length;

for( i = 0; i < l; ++i ) {
someObject.someMethod( +separateDigits[i] );
}

0

为了从中获取数字的一种有效方法numberstring从您的中获取一个number,将其拆分为array(字符),然后将每个元素映射回一个数字。

例如:

var number = 123456;

var array = number.toString()
.split('')
.map(function(item, index) {
   return parseInt(item);
});

console.log(array); // returns [1, 2, 3, 4, 5, 6]

如果还需要对所有数字求和,则可以将reduce()方法附加到前面的代码中:

var num = 123456;

var array = num.toString()
.split('')
.map(function(item, index) {
   return parseInt(item);
})
.reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
}, 0);

console.log(array); // returns 21

作为替代方案,在ECMAScript 2015(第6版)中,可以使用箭头功能

var number = 123456;
var array = number.toString().split('').map((item, index) => parseInt(item));
console.log(array); // returns [1, 2, 3, 4, 5, 6]

如果您需要对所有数字求和,可以将reduce()方法附加到前面的代码中:

var num = 123456;

var result = num.toString()
.split('')
.map((item, index) => parseInt(item))
.reduce((previousValue, currentValue) => previousValue + currentValue, 0);

console.log(result); // returns 21


0
function iterateNumber(N, f) {
    let n = N;
    var length = Math.log(n) * Math.LOG10E + 1 | 0;
    for (let i = 0; i < length; i++) {
        const pow = Math.pow(10, length - i - 1)
        let c = (n - (n % pow)) / pow
        f(c, i)
        n %= pow
    }
}

6
您应该解释您的答案。当前,这只是代码块,不包含任何注释或对尝试学习该概念的人们的帮助。
Goose

0

('' + 123456789).split('').map( x => +x ).reduce( (a,b) => a+b ) === 45

真正

或没有地图

('' + 123456789).split('').reduce( (a,b) => (+a)+(+b) ) === 45

真正


最初的问题是关于将数字拆分并将它们加在一起的
gkelly

0

您可以单行执行,将每个数字分开,然后将它们加在一起:

var may = 12987;
var sep = (""+may).split("").map(n=>+n).reduce((a,b)=>a+b);

0

这是我的简短解决方案。

    function sum (num) {
    let sNumber = num
        .toString()
        .split('')
        .reduce((el1, el2) => {
            return Number(el1) + Number(el2)
        }, 0)
        return sNumber
     }

console.log(sum(123))
console.log(sum(456))


0

javascript具有此功能,您可以轻松使用它。

console.log(new Intl.NumberFormat().format(number));

例如 :

console.log(new Intl.NumberFormat().format(2334325443534));
==> 2,334,325,443,534

0

我可能是错的,但是解决方案却是零碎的。正如我仍在学习的那样,也许这些功能可以在同一功能中完成许多工作。请毫不犹豫地纠正我。

const totalSum = (num) => [...num + ' '].map(Number).reduce((a, b) => a + b);

因此,我们将参数转换为arr并添加空格。我们对每个元素都执行此操作,然后使用map方法将其推入新数组。拆分后,我们使用reduce求和所有元素并求和。

正如我说的,如果您看到我不了解的内容,请毫不犹豫地纠正我或改善功能。

差点忘了,以防万一:

const totalSum = (num) => ( num === 0 || num < 0) ? 'I need a positive number' : [...num + ' '].map(Number).reduce((a, b) => a + b);

如果为负数或仅为零,则将其作为参数。祝大家编码愉快。


0

用遍历每个数字 for...of语句。

通过+在字符串之前添加符号,它将被转换为数字。

const num = 143,
  digits = [];

for (const digit of `${num}`) {
  digits.push(+digit)
}
console.log(digits);

@iampopov的启发您可以使用传播语法来编写它。

const num = 143;
const digits = [...`${num}`].map(Number);
console.log(digits);


0

我将发布此答案以介绍unshift的使用,这是一种现代解决方案。使用push,您将添加到数组的末尾,而unshift则添加到数组的开始。这使数学方法更强大,因为您不再需要反转。

let num = 278;
let digits = [];
while (num > 0) {
    digits.unshift(num % 10);
    num = parseInt(num / 10);
}
console.log(digits);


0

使用String...map

const num = 7890;

const digits = [...String(num)].map(Number);

console.log(digits)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.