79

This is my code so far:

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

But when I run my code I get this: [9, 1, 2, 3, 4, 5, 6, 7, 8]

If anyone can see the problem or find a better solution I would very much appreciate it!

1

25 Answers 25

106

Why not just do this?

var n = 123456789; var digits = (""+n).split(""); 
Sign up to request clarification or add additional context in comments.

9 Comments

Just a note, this will give an array of strings.. not numbers.
Good point. But by the look of it the digit will then be multiplied by themselves, which I believe works fine. All that has to be done is be careful, and probably use parseInt(...,10); at appropriate times.
the problem is I want to square the digits after, and i believe I cant do that with a string?
for (var i = 0; i < digits.length; i++) { digits[i] = +digits[i]; } will convert each value to an integer too
(""+num1).split('').map(Number) to return array of numbers instead of string.
|
103

What about:

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

6 Comments

Nice solution, clear and easy to understand, and makes use of ES6 features. Also one of the recommended features here
.map(Number) is very nice!
By far the best answer
love this solution -- it forces me to do some discovery on global objects and their functionality
Could anyone explain why .map(Number) works the way it does?
|
57
(123456789).toString(10).split("") 

^^ this will return an array of strings

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

^^ this will return an array of ints

4 Comments

This will also give an array of strings.. not numbers
Nice! Just make note that .map isn't available in IE 8 or below.
One would expect map(parseInt) to work but Array.map calls the function also with the index and the array itself (was it really necessary?) so it won't work.
Beware! There’s well known pitfall. Yet another do-not-read-documentation-but-yell-at-stupid-javascript case.
27

I realize this was asked several months ago, but I have an addition to samccone's answer which is more succinct but I don't have the rep to add as a comment!

Instead of:

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

Consider:

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

5 Comments

What exactly does the 10 do in .toString(10) ? I know it references radix 10, but I've tested it with and without and can't find a discernible difference. Thanks! Also, cool edit.
@EFH If the radix is not specified, the preferred radix is assumed to be 10. Ref(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)
Just wanted to drop a "amazing solution" here.
.toString(10) specifies base 10 numbers. Another example would be .toString(2) which specifies binary numbers. Test those two out.
See also @nicolás-fantone 's ES6-based solution below. Array.from(n.toString()).map(Number);
22

Modified the above answer a little bit. We don't really have to call the 'map' method explicitly, because it is already built-in into the 'Array.from' as a second argument. As of MDN.

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

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

1 Comment

I like it, though it's probably appropriate to use const whenever you aren't going to reassign a variable
5

const toIntArray = (n) => ([...n + ""].map(v => +v))

Comments

4

It is pretty short using Array destructuring and String templates:

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

Comments

4

Assuming the value n:

const n = 123456789 

A minimal ES6 version if you'd like:

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

An even shorter but less readable version:

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

Want to go even shorter (but less readable)?

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

Shorter you say (and basically illegible)!?

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

Now you're a real programmer, congrats!

Side note

These aren't really efficient (as most in this thread) since you're allocating 2 arrays instead of 1. Want to be more efficient? Try this which only allocates one array:

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

Oldschool but more efficient, huzzah!

Comments

3

This will work for a number greater than 0. You don't need to convert the number into string:

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

1 Comment

thank you!! Was looking for an answer that doesn't convert to string -> array -> array of numbers. This is probably the most performant way, but I guess they would all be O(n) anyways.
2

It's very simple, first convert the number to string using the toString() method in JavaScript and then use split() method to convert the string to an array of individual characters.

For example, the number is num, then

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

Comments

2

You can get a list of string from your number, by converting it to a string, and then splitting it with an empty string. The result will be an array of strings, each containing a digit:

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

OR to build on this, map each string digit and convert them to a Number:

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

Comments

2

Suppose,

let a = 123456 

First we will convert it into string and then apply split to convert it into array of characters and then map over it to convert the array to integer.

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

1 Comment

Please don't post only code as answer, but also provide an explanation what your code does and how it solves the problem of the question. Answers with an explanation are usually more helpful and of better quality, and are more likely to attract upvotes.
1

Here's an alternative to Nicolás Fantone's answer. You could argue it's maybe a little less readable. The emphasis is that Array.from() can take an optional map function as a parameter. There are some performance gains this way since no intermediate array gets created.

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

1 Comment

this style will be come more human-readable as more coders become more familiar with fat arrows.
1
const number = 1435; number.toString().split('').map(el=>parseInt(el)); 

1 Comment

Welcome to Stack Overflow! Welcome to Stack Overflow! Please read what this site is about and "How to answer" before answering a question.
1
let input = 12345664 const output = [] while (input !== 0) { const roundedInput = Math.floor(input / 10) output.push(input - roundedInput * 10) input = roundedInput } console.log(output) 

1 Comment

I like this answer but I had to add output.reverse() in the end to get the numbers in the correct order as I needed to maintain number positions.
1

split, then looped over to square

here the numbers are split, then squared.

const n = 123456; const numArr = Array.from(n.toString()); for (let i = 0; i < numArr.length; i++) { numArr[i] = `${numArr[i]**2}`; } console.log(numArr); 

Comments

0

Move:

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

above

var j = k / 10; 

Comments

0
var num = 123456789; num = num.toString(); //'123456789' var digits = num.split(""); //[ '1', '2', '3', '4', '5', '6', '7', '8', '9' ] 

1 Comment

While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
0

It's been a 5+ years for this question but heay always welcome to the efficient ways of coding/scripting.

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

Comments

0

Another method here. Since number in Javascript is not splittable by default, you need to convert the number into a string first.

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

Comments

0

I ended up solving it as follows:

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

Comments

0

Update with string interpolation in ES2015.

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

Comments

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

Now the number n is divided to its digits and they are presented in an array, and each element of that array is in string format. To transform them to number format do this:

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

Or get an array with all elements in number format from the beginning:

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

Comments

0

This is actually the cleanest solution I think.

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

You put it in a string literal but it is kept as numbers, and then it is split to an array and assigned to digits.

Comments

-1

const toIntArray = (n) => ([...n + ""].map(v => +v))

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.