String in ein Array von Integern umwandeln

Lesezeit: 5 Minuten

Ich möchte die folgende Zeichenfolge konvertieren '14 2' in ein Array aus zwei ganzen Zahlen. Wie kann ich es tun ?

Benutzer-Avatar
xer0x

Eine schnelle für moderne Browser:

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

// [14, 2]`

  • Sehr sauberer Weg! Sollte top sein.

    – Haselnuss

    23. Juni 2014 um 16:45 Uhr

  • Bälle. das ist toll. so frisch und so sauber.

    – Todd

    29. Oktober 2014 um 18:33 Uhr

  • +1 und fügen Sie bei Bedarf einfach Polyfill für die Unterstützung älterer Browser hinzu developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

    – qdev

    9. Oktober 2015 um 8:03 Uhr

  • schön, aber wie funktioniert das eigentlich? Sie übergeben das Number-Objekt, sind sich aber nicht sicher, wie es konvertiert wird. Ich dachte, Sie müssten eine Funktion zum Zuordnen übergeben.

    – Jarg7

    31. Mai 2016 um 22:51 Uhr

  • ja, das stimmt. Number() ist die an map übergebene Funktion und wandelt die Werte um. Weitere Einzelheiten finden Sie in Todds Antwort.

    – xer0x

    9. Juni 2016 um 5:56 Uhr

Du kannst .split() um eine Reihe von zu bekommen Saitendann durchschleifen, um sie wie folgt in Zahlen umzuwandeln:

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

Das +myArray[i] ist nur ein schneller Weg, um die Zahlenumwandlung durchzuführen, wenn Sie sicher sind, dass es sich um ganze Zahlen handelt, können Sie einfach Folgendes tun:

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

  • kürzer: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0; unter Verwendung der bitweisen Konvertierung und kürzerer Schleifen

    – vsync

    8. Juni 2011 um 23:13 Uhr

  • oder mit ES5: myArray.forEach(function(x,y,z){ z[y]=x|0 })

    – vsync

    8. Juni 2011 um 23:26 Uhr

  • @vsync – sicher … aber wenn ein Compiler es noch mehr verkürzen wird, warum sollte es dann schmerzhaft sein, es zu warten? 🙂 Klarheit ist ein paar zusätzliche Bytes wert, besonders wenn es nicht mehr lange dauern wird, wenn überhaupt, wenn es einmal herunterminimiert wird.

    – Nick Craver

    9. Juni 2011 um 0:24 Uhr

  • denn ausnahmsweise verkleinere ich meinen veröffentlichten Code nicht, damit andere meinen Code lesen und sehen können, was passiert, und zweitens sind bitweise Operationen viel schneller als parseInt.

    – vsync

    9. Juni 2011 um 0:37 Uhr

  • @vsync – Stellen Sie sicher, dass Sie diese Behauptung in allen Browsern testen. Ich persönlich finde das + besser lesbar … und wenn Sie testen, gibt es bei den meisten der neuesten Browser in beiden Fällen einen vernachlässigbaren Unterschied – je nach Engine. Außerdem können Sie eine anbieten .min.js und .js Wenn Sie Ihren Code offenlegen möchten … denken Sie daran, dass die Minimierung nicht zur Unklarheit dient (oder nicht sein sollte, da sie dafür ungefähr nutzlos ist), sondern zur Reduzierung des HTTP-Overheads – ein schnelleres Laden der Seite für Ihre Benutzer.

    – Nick Craver

    9. Juni 2011 um 0:48 Uhr

Benutzer-Avatar
Todd

SO … älterer Thread, ich weiß, aber …

BEARBEITEN

@RoccoMusolino hatte einen schönen Fang; hier ist eine Alternative:

TL;DR:

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

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

Es gibt einen subtilen Fehler in den hier aufgeführten eleganteren Lösungen, insbesondere in den ansonsten schönen Antworten von @amillara und @Marcus.

Das Problem tritt auf, wenn ein Element des String-Arrays nicht ganzzahlig ist, möglicherweise in einem Fall ohne Validierung einer Eingabe. Als erfundenes Beispiel…

Das Problem:


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

Da Sie offensichtlich ein PURE int-Array wollen, ist das ein Problem. Ganz ehrlichich habe das nicht verstanden, bis ich SO-Code in mein Skript kopiert und eingefügt habe … : /

Das (etwas weniger baller) Fix:


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

Also, selbst wenn Sie Mist int string haben, ist Ihre Ausgabe ein reines Integer-Array. Die anderen sind in den meisten Fällen wirklich sexy, aber ich wollte meine meistens rabiat anbieten w’eigentlich. Es ist immer noch ein Einzeiler, zu meiner Ehre …

Hoffe, es spart jemand Zeit!

  • Totes Baller genug für mich. Danke, Todd!

    – indexzwei

    2. Dezember 2015 um 18:04 Uhr

  • Achtung, dies funktioniert nicht, wenn Ihr String eine oder mehrere 0 enthält. Null wird in boolean=false übersetzt, sodass der boolesche Filter sie nicht behält.

    – Rocco Musolino

    3. November 2016 um 14:25 Uhr


  • kannst du ersetzen .filter(Boolean) mit .filter( (x) => !Number.isNaN(x))

    – Bob9630

    5. Februar 2018 um 1:09 Uhr


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

Eine Alternative zur Antwort von Tushar Gupta wäre:

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

// [14, 2]`

Beim Code-Golf sparen Sie 1 Zeichen. Hier ist das “+” ein “unärer Plus”-Operator, funktioniert wie parseInt.

Teilen Sie zuerst die Zeichenfolge auf Leerzeichen auf:

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

Konvertieren Sie dann das Ergebnisarray von Strings in Ganzzahlen:

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

Der Punkt dagegen parseInt-sich nähern:

Es besteht keine Notwendigkeit, Lambdas zu verwenden und/oder zu geben radix Parameter zu parseIntbenutz einfach parseFloat oder Number stattdessen.


Gründe dafür:

  1. Es funktioniert:

    var src = "https://stackoverflow.com/questions/4291447/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 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: Im Firefox parseInt arbeitet etwa 4 mal schneller, aber immer noch langsamer als andere. In Summe: +e < Number < parseFloat < parseInt

1186540cookie-checkString in ein Array von Integern umwandeln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy