Ich möchte die folgende Zeichenfolge konvertieren '14 2'
in ein Array aus zwei ganzen Zahlen. Wie kann ich es tun ?
String in ein Array von Integern umwandeln
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
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 parseInt
benutz einfach parseFloat
oder Number
stattdessen.
Gründe dafür:
-
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
-
Es ist kürzer.
-
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