Wie konvertiere ich eine Folge von Zahlen in ein Array von Zahlen?

186

Ich habe unten Zeichenfolge -

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

wenn ich es tue -

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

Ich verstehe bals["1", "2", "3", "4"]

kann ich etwas tun, um bals zu bekommen [1, 2, 3, 4]?

Ashwin
quelle

Antworten:

24

Meine 2 Cent für Golfer:

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

backquote ist string litteral, daher können wir die Klammer weglassen (aufgrund der Art der Teilungsfunktion), aber es ist äquivalent zu split(','). Die Zeichenfolge ist jetzt ein Array. Wir müssen lediglich jeden Wert mit einer Funktion abbilden, die die Ganzzahl der Zeichenfolge zurückgibt. Dies x=>+xist also noch kürzer als die NumberFunktion (5 Zeichen anstelle von 6).

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

Ich hoffe es ist etwas klarer.

Falle II
quelle
Warum funktioniert das so? Scheint nicht elegant, weil es zu abstrahiert ist.
Christian Matthew
Warum sollten wir uns darum kümmern, wie viele Zeichen die Kartenfunktion verwendet?
SafeFastExpressive
Seltsamerweise sind in Winkel 7 die Klammern erforderlich.
James LoForti
@SafeFastExpressive, da dies eine Version für "Golfer" ist, wenn Sie nicht wissen, wovon ich spreche: codegolf.stackexchange.com
TrapII
406

Sie können Array.mapjedes Element in eine Zahl umwandeln.

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

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

Überprüfen Sie die Dokumente


Oder eleganter, wie vom Benutzer hervorgehoben: thg435

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

Wo Number()würde der Rest erledigt: hier überprüfen


Hinweis: Für ältere Browser, die dies nicht unterstützen map, können Sie eine Implementierung wie folgt hinzufügen:

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
quelle
2
Der "Tricky Use Case" in der Dokumentation spricht tatsächlich über dieses Thema.
Antony
87
oder einfach map(Number).
Georg
Hinweis: Stellen Sie sicher, dass Sie die Browserversion in diesem Link überprüfen. IE8 unterstützt Array.map nicht. (Überraschend, wie?)
Joe Zack
1
Es ist erwähnenswert, dass Number () keine ganzen Zahlen erzwingt, sondern nur Zahlen. Wenn Sie speziell in Ints umwandeln müssen, verwenden Sie parseInt (). "1.1,2,3".split(",").map(Number)ist [1.1, 2, 3]während "1.1,2,3".split(",").map(item => parseInt(item, 10))ist[1, 2, 3]
dtbarne
1
@Sachith - Das zweite Argument für parseInt () ist die Basis. In diesem Fall 10. Ref: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
techfoobar
18

Ordnen Sie es ganzen Zahlen zu:

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

mapprüft jedes Array-Element, übergibt es an die bereitgestellte Funktion und gibt ein Array mit den Rückgabewerten dieser Funktion zurück. mapist in alten Browsern nicht verfügbar, aber die meisten Bibliotheken wie jQuery oder Unterstrich enthalten eine browserübergreifende Version.

Oder wenn Sie Loops bevorzugen:

var res = a.split(",");
for (var i=0; i<res.length; i++)
{
    res[i] = parseInt(res[i], 10);
}
Matt Zeunert
quelle
15

+stringwird versuchen, die Zeichenfolge in eine Zahl zu ändern. Verwenden Sie dann die Array.mapFunktion, um jedes Element zu ändern.

"1,2,3,4".split(',').map(function(el){ return +el;});
xdazz
quelle
11

Eine kürzere Lösung: Ordnen Sie die Argumente zu und übergeben Sie sie an Number:

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

nicael
quelle
10

Array.from () für Details finden Sie unter MDN

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

b ist ein Array von Zahlen

Aymen
quelle
2
Dies ist der einfachste Weg, den ich gefunden habe !!
FonzTech
9

Dies ist sehr einfach. So wie:

["1", "2", "3", "4"].map(i=>Number(i))
Q10Viking
quelle
3

Als Variante können Sie Combiantion _.mapund _.aryMethoden aus der lodash-Bibliothek verwenden . Die gesamte Transformation wird kompakter sein. Hier ist ein Beispiel aus der offiziellen Dokumentation :

_.map(['6', '8', '10'], _.ary(parseInt, 1));
// → [6, 8, 10]
Alexander Myschow
quelle
3

Es ist nicht erforderlich, Lambdas zu verwenden und / oder radixParameter anzugeben parseInt, sondern nur parseFloatoder Numberstattdessen.

Gründe dafür:

  1. Es funktioniert:

    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. Es ist kürzer.

  3. Es ist ein kleines bisschen schneller und nutzt den Cache, wenn parseInt- Ansatz - nicht :

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

Hinweis: In Firefox parseIntfunktioniert es ungefähr viermal schneller, aber immer noch langsamer als andere. Insgesamt: +e<Number < parseFloat<parseInt

ankhzet
quelle
3

Der Unterstrich js Weg -

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
quelle
2

Matt Zeunerts Version mit Arraw-Funktion (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));
FreeClimb
quelle
1
Wofür stehen 10?
Dinesh Kanivu
1

Da alle Antworten NaNenthalten sein können, dachte ich, ich würde hinzufügen, dass Sie dies tun können, wenn Sie schnell ein Array gemischter Werte in Zahlen umwandeln möchten.

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.
user7986267
quelle
1

Einzeiler

Array.from(a.split(','), Number)
Praveen Kishor
quelle