convert string into array of integers

Javascript

Javascript Problem Overview


I want to convert the following string '14 2' into an array of two integers. How can I do it ?

Javascript Solutions


Solution 1 - Javascript

A quick one for modern browsers:

'14 2'.split(' ').map(Number);

// [14, 2]`

Solution 2 - Javascript

You can .split() to get an array of strings, then loop through to convert them to numbers, like this:

var myArray = "14 2".split(" ");
for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } 
//use myArray, it's an array of numbers

The +myArray[i] is just a quick way to do the number conversion, if you're sure they're integers you can just do:

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 

Solution 3 - Javascript

SO...older thread, I know, but...

#EDIT @RoccoMusolino had a nice catch; here's an alternative:

TL;DR:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

WRONG: "5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

There is a subtle flaw in the more elegant solutions listed here, specifically @amillara and @Marcus' otherwise beautiful answers.

The problem occurs when an element of the string array isn't integer-like, perhaps in a case without validation on an input. For a contrived example...

The problem:


var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN]

Since you obviously want a PURE int array, that's a problem. Honestly, I didn't catch this until I copy-pasted SO code into my script... :/


The (slightly-less-baller) fix:


var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69]

So, now even when you have crap int string, your output is a pure integer array. The others are really sexy in most cases, but I did want to offer my mostly rambly w'actually. It is still a one-liner though, to my credit...

Hope it saves someone time!

Solution 4 - Javascript

var result = "14 2".split(" ").map(function(x){return parseInt(x)});

Solution 5 - Javascript

An alternative to Tushar Gupta answer would be :

'14 2'.split(' ').map(x=>+x);

// [14, 2]`

In code golf you save 1 character. Here the "+" is "unary plus" operator, works like parseInt.

Solution 6 - Javascript

First split the string on spaces:

var result = '14 2'.split(' ');

Then convert the result array of strings into integers:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

Solution 7 - Javascript

The point against parseInt-approach:

There's no need to use lambdas and/or give radix parameter to parseInt, just use parseFloat or Number instead.


Reasons:

  1. It's working:

     var src = "1,2,5,4,3";
     var ids = src.split(',').map(parseFloat); // [1, 2, 5, 4, 3]
    
     var obj = {1: ..., 3: ..., 4: ..., 7: ...};
     var keys= Object.keys(obj); // ["1", "3", "4", "7"]
     var ids = keys.map(parseFloat); // [1, 3, 4, 7]
    
     var arr = ["1", 5, "7", 11];
     var ints= arr.map(parseFloat); // [1, 5, 7, 11]
     ints[1] === "5" // false
     ints[1] === 5   // true
     ints[2] === "7" // false
     ints[2] === 7   // true
    
  2. It's shorter.

  3. It's a tiny bit quickier and takes advantage of cache, when parseInt-approach - doesn't:

       // execution time measure function
       // keep it simple, yeah?
     > var f = (function (arr, c, n, m) {
           var i,t,m,s=n();
           for(i=0;i++<c;)t=arr.map(m);
           return n()-s
       }).bind(null, "2,4,6,8,0,9,7,5,3,1".split(','), 1000000, Date.now);
       
     > f(Number) // first launch, just warming-up cache
     > 3971 // nice =)
    
     > f(Number)
     > 3964 // still the same
    
     > f(function(e){return+e})
     > 5132 // yup, just little bit slower
    
     > f(function(e){return+e})
     > 5112 // second run... and ok.
    
     > f(parseFloat)
     > 3727 // little bit quicker than .map(Number)
    
     > f(parseFloat)
     > 3737 // all ok
    
     > f(function(e){return parseInt(e,10)})
     > 21852 // awww, how adorable...
    
     > f(function(e){return parseInt(e)})
     > 22928 // maybe, without '10'?.. nope.
    
     > f(function(e){return parseInt(e)})
     > 22769 // second run... and nothing changes.
    
     > f(Number)
     > 3873 // and again
     > f(parseFloat)
     > 3583 // and again
     > f(function(e){return+e})
     > 4967 // and again
    
     > f(function(e){return parseInt(e,10)})
     > 21649 // dammit 'parseInt'! >_<
    

Notice: In Firefox parseInt works about 4 times faster, but still slower than others. In total: +e < Number < parseFloat < parseInt

Solution 8 - Javascript

If the numbers can be separated by more than one space, it is safest to split the string on one or more consecutive whitespace characters (which includes tabs and regular spaces). With a regular expression, this would be \s+.

You can then map each element using the Number function to convert it. Note that parseInt will not work (i.e. arr.map(parseInt)) because map passes three arguments to the mapping function: the element, the index, and the original array. parseInt accepts the base or radix as the second parameter, so it will end up taking the index as the base, often resulting in many NaNs in the result. However, Number ignores any arguments other than the first, so it works directly.

const str = '1\t\t2   3	4';
const result = str.split(/\s+/).map(Number); //[1,2,3,4]

To remove elements that are not numbers, Array#filter can be used in conjunction with isNaN.

const str = '1\t\t2   3 ab	4 c';
const result = str.split(/\s+/).map(Number).filter(x => !isNaN(x)); //[1,2,3,4]

You could also use an anonymous function for the mapping callback with the unary plus operator to convert each element to a number.

const str = '1\t\t2   3	4';
const result = str.split(/\s+/).map(x => +x); //[1,2,3,4]

With an anonymous function for the callback, you can decide what parameters to use, so parseInt can also work.

const str = '1\t\t2   3	4';
const result = str.split(/\s+/).map(x => parseInt(x)); //[1,2,3,4]

Solution 9 - Javascript

Just for fun I thought I'd throw a forEach(f()) solution in too.

var a=[];
"14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))});

// a = [14,2]

Solution 10 - Javascript

let idsArray = ids.split(',').map((x) => parseInt(x));

Solution 11 - Javascript

Better one line solution:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

Solution 12 - Javascript

us the split function:

var splitresult = "14 2".split(" ");

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser425243View Question on Stackoverflow
Solution 1 - Javascriptxer0xView Answer on Stackoverflow
Solution 2 - JavascriptNick CraverView Answer on Stackoverflow
Solution 3 - JavascriptToddView Answer on Stackoverflow
Solution 4 - JavascriptamillaraView Answer on Stackoverflow
Solution 5 - JavascriptYann RollandView Answer on Stackoverflow
Solution 6 - JavascriptMarcus WhybrowView Answer on Stackoverflow
Solution 7 - JavascriptankhzetView Answer on Stackoverflow
Solution 8 - JavascriptUnmitigatedView Answer on Stackoverflow
Solution 9 - JavascriptocodoView Answer on Stackoverflow
Solution 10 - JavascriptAhmed SaidView Answer on Stackoverflow
Solution 11 - JavascriptRavi GaurView Answer on Stackoverflow
Solution 12 - JavascriptpyviView Answer on Stackoverflow