Jak przekonwertować ciąg liczb na tablicę liczb?

188

Mam poniżej ciągu -

var a = "1,2,3,4";

kiedy robię -

var b = a.split(',');

dostaję b jak["1", "2", "3", "4"]

Mogę coś zrobić, aby uzyskać bjak [1, 2, 3, 4]?

Ashwin
źródło

Odpowiedzi:

25

Moje 2 centy dla golfistów:

b="1,2,3,4".split`,`.map(x=>+x)

backquote jest łańcuchem literałowym, więc możemy pominąć nawias (ze względu na naturę funkcji podziału), ale jest on równoważny split(','). Ciąg jest teraz tablicą, musimy tylko odwzorować każdą wartość za pomocą funkcji zwracającej liczbę całkowitą ciągu, więc x=>+x(która jest nawet krótsza niż Numberfunkcja (5 znaków zamiast 6)) jest równoważna z:

function(x){return parseInt(x,10)}// version from techfoobar
(x)=>{return parseInt(x)}         // lambda are shorter and parseInt default is 10
(x)=>{return +x}                  // diff. with parseInt in SO but + is better in this case
x=>+x                             // no multiple args, just 1 function call

Mam nadzieję, że to trochę bardziej jasne.

Pułapka II
źródło
dlaczego to tak działa? Wydaje się nie elegancki, ponieważ jest zbyt abstrakcyjny.
Christian Matthew
Dlaczego miałoby nas obchodzić, ile znaków używa funkcja mapy?
SafeFastExpressive
Dziwne, w kącie 7 wymagany jest nawias.
James LoForti
@SafeFastExpressive, ponieważ jest to wersja dla „golfistów”, jeśli nie wiesz o czym mówię: codegolf.stackexchange.com
TrapII
408

Możesz użyć Array.mapdo przekonwertowania każdego elementu na liczbę.

var a = "1,2,3,4";

var b = a.split(',').map(function(item) {
    return parseInt(item, 10);
});

Sprawdź dokumenty


Lub bardziej elegancko, jak wskazał użytkownik: thg435

var b = a.split(',').map(Number);

Gdzie Number()zrobi resztę: sprawdź tutaj


Uwaga: w przypadku starszych przeglądarek, które nie obsługują map, możesz samodzielnie dodać implementację, taką jak:

Array.prototype.map = Array.prototype.map || function(_x) {
    for(var o=[], i=0; i<this.length; i++) { 
        o[i] = _x(this[i]); 
    }
    return o;
};
techfoobar
źródło
2
„Przypadek użycia Tricky” w dokumentacji rzeczywiście mówi na ten temat.
Antony
87
lub po prostu map(Number).
Georg
Uwaga: sprawdź wersję przeglądarki pod tym linkiem, IE8 nie obsługuje Array.map. (Zaskakujące, prawda?)
Joe Zack
1
Warto zauważyć, że Number () nie wymusza liczb całkowitych, tylko liczby. Jeśli chcesz rzutować konkretnie na ints, użyj parseInt (). "1.1,2,3".split(",").map(Number)to [1.1, 2, 3]mając na uwadze, że "1.1,2,3".split(",").map(item => parseInt(item, 10))jest[1, 2, 3]
dtbarne
1
@Sachith - Drugi argument parseInt () jest podstawą. W tym przypadku 10. Patrz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
techfoobar
18

Zamapuj na liczby całkowite:

a.split(',').map(function(i){
    return parseInt(i, 10);
})

mapsprawdza każdy element tablicy, przekazuje go do podanej funkcji i zwraca tablicę ze zwracanymi wartościami tej funkcji. mapnie jest dostępne w starych przeglądarkach, ale większość bibliotek, takich jak jQuery lub podkreślenie, zawiera wersję dla różnych przeglądarek.

Lub, jeśli wolisz pętle:

var res = a.split(",");
for (var i=0; i<res.length; i++)
{
    res[i] = parseInt(res[i], 10);
}
Matt Zeunert
źródło
15

+stringspróbuje zmienić ciąg na liczbę. Następnie użyj Array.mapfunkcji, aby zmienić każdy element.

"1,2,3,4".split(',').map(function(el){ return +el;});
xdazz
źródło
13

Array.from () w celu uzyskania szczegółowych informacji przejdź do MDN

var a = "1,2,3,4";
var b = Array.from(a.split(','),Number);

b to tablica liczb

Aymen
źródło
2
To najprostszy sposób, jaki znalazłem !!
FonzTech,
11

Krótsze rozwiązanie: zamapuj i przekaż argumenty do Number:

var a = "1,2,3,4";
var b = a.split(',');
console.log(b);
var c = b.map(Number);
console.log(c);

Nicość
źródło
10

To jest bardzo proste. Na przykład:

["1", "2", "3", "4"].map(i=>Number(i))
Q10 Wiking
źródło
3

Jako wariant możesz użyć kombinacji _.mapi _.arymetod z biblioteki lodash . Cała transformacja będzie bardziej zwarta. Oto przykład z oficjalnej dokumentacji :

_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]
Aleksander Myszow
źródło
3

Nie ma potrzeby używania lambda i / lub podawania radixparametru parseInt, wystarczy użyć parseFloatlub Numberzamiast tego.

Powody:

  1. To działa:

    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. Jest krótszy

  3. Jest trochę szybszy i wykorzystuje pamięć podręczną, gdy parseInt-podejście - nie :

      // 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'! >_<

Uwaga: W przeglądarce Firefox parseIntdziała około 4 razy szybciej, ale nadal wolniej niż inne. W sumie: +e< Number< parseFloat<parseInt

ankhzet
źródło
3

Sposób podkreślenia js -

var a = "1,2,3,4",
  b = a.split(',');

//remove falsy/empty values from array after split
b = _.compact(b);
//then Convert array of string values into Integer
b = _.map(b, Number);

console.log('Log String to Int conversion @b =', b);
Mohan Dere
źródło
3

Wersja Matta Zeunerta z funkcją Arraw (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));
FreeClimb
źródło
1
za co odpowiada 10?
Dinesh Kanivu
3

Jedna wkładka

Array.from(a.split(','), Number)
Praveen Kishor
źródło
1

Ponieważ wszystkie odpowiedzi pozwalają NaNna uwzględnienie, pomyślałem, że dodam, że jeśli chcesz szybko rzucić tablicę mieszanych wartości na liczby, możesz to zrobić.

var a = "1,2,3,4,foo,bar";

var b = a.split(',');

var result = b.map(_=>_|0) // Floors the number (32-bit signed integer) so this wont work if you need all 64 bits.

// or b.map(_=>_||0) if you know your array is just numbers but may include NaN.
użytkownik7986267
źródło