Antworten:
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.
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;
};
map(Number).
"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]
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);
}
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);
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]
Es ist nicht erforderlich, Lambdas zu verwenden und / oder radixParameter anzugeben parseInt, sondern nur parseFloatoder Numberstattdessen.
Gründe dafür:
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 // trueEs ist kürzer.
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
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);
Matt Zeunerts Version mit Arraw-Funktion (ES6)
const nums = a.split(',').map(x => parseInt(x, 10));
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.
Einzeiler
Array.from(a.split(','), Number)