Bir sayı dizisini sayı dizisine nasıl dönüştürebilirim?


188

Aşağıdaki dize var -

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

ben yaparken -

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

Ben olsun bolarak["1", "2", "3", "4"]

Ben almak için bir şeyler yapabiliriz bolarak [1, 2, 3, 4]?

Yanıtlar:


25

Golfçüler için 2 sentim:

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

backquote, string litteral olduğundan parantezini atlayabiliriz (split işlevinin doğası gereği) ama eşdeğerdir split(','). Dize şimdi bir dizi, sadece her değeri dizenin tamsayısını döndüren bir işlevle eşlemeliyiz x=>+x(yani Numberişlevden bile daha kısa (6 yerine 5 karakter)):

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

Umarım biraz daha açıktır.


bu neden böyle çalışıyor? Zarif görünmüyor çünkü çok soyutlanmış.
Christian Matthew

Harita işlevinin kaç karakter kullandığı ile ilgilenelim?
SafeFastExpressive

Tuhaf, açısal 7'de parantez gereklidir.
James LoForti

@SafeFastExpressive bu "golfçüler" için bir sürüm olduğu için, neden bahsettiğimi bilmiyorsanız: codegolf.stackexchange.com
TrapII

408

Array.mapHer öğeyi bir sayıya dönüştürmek için kullanabilirsiniz .

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

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

Dokümanları Kontrol Edin


Veya daha şık Kullanıcı tarafından işaret edildiği gibi: thg435

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

Number()Gerisini nerede yapardı: buraya bakın


Not: Desteklemeyen eski tarayıcılar için mapkendiniz gibi bir uygulama ekleyebilirsiniz:

Array.prototype.map = Array.prototype.map || function(_x) {
    for(var o=[], i=0; i<this.length; i++) { 
        o[i] = _x(this[i]); 
    }
    return o;
};

2
"Zor bir kullanım durumu" belgelerinde aslında bu konuda bahsediyor.
Antony

87
ya da basitçe map(Number).
georg

Not: bu bağlantıdaki tarayıcı sürümünü kontrol ettiğinizden emin olun, IE8 Array.map'yi desteklemez. (Şaşırtıcı, ha?)
Joe Zack

1
Number () değerinin tamsayıları zorlamayacağını, yalnızca sayıları zorladığını belirtmek gerekir. Özellikle ints'e yayın yapmanız gerekiyorsa, parseInt () kullanın. "1.1,2,3".split(",").map(Number)olduğunu [1.1, 2, 3]oysa "1.1,2,3".split(",").map(item => parseInt(item, 10))ise[1, 2, 3]
dtbarne

1
@Sachith - parseInt () öğesinin ikinci argümanı temeldir. Bu durumda 10. Ref: developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
techfoobar

18

Tamsayılarla eşleştirin:

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

mapher dizi öğesine bakar, sağlanan işleve iletir ve o işlevin döndürdüğü değerleri içeren bir dizi döndürür. mapeski tarayıcılarda mevcut değildir, ancak jQuery veya alt çizgi gibi kitaplıkların çoğu çapraz tarayıcı sürümünü içerir.

Veya döngüleri tercih ediyorsanız:

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

15

+stringdizeyi bir sayıya değiştirmeye çalışır. Ardından Array.mapher öğeyi değiştirmek için işlevi kullanın.

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

13

Ayrıntılar için Array.from () işlevi MDN'ye gidin

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

b bir sayı dizisidir


2
Bu bulduğum en basit yol !!
FonzTech

11

Daha kısa çözümü: harita ve argümanlar geçmek Number:

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




3

Lambdas kullanmaya ve / veya radixparametre vermenize gerek yoktur parseInt, sadece parseFloatveya Numberyerine kullanın.

Nedenleri:

  1. İşe yarıyor:

    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. Daha kısa.

  3. Bu biraz daha tuhaf ve önbellekten yararlanır,parseInt -yaklaşım - yapmazsa :

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

Uyarı: Firefox'ta parseIntyaklaşık 4 kat daha hızlı çalışır, ancak yine de diğerlerinden daha yavaştır. Toplamda: +e< Number< parseFloat<parseInt


3

Alt çizgi js yolu -

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);

3

Matt Zeunert'in arraw işlevine sahip sürümü (ES6)

const nums = a.split(',').map(x => parseInt(x, 10));

1
10 ne anlama geliyor?
Dinesh Kanivu


1

Tüm cevaplar NaNdahil edilmesine izin verdiğinden, hızlı bir şekilde karışık değerlerden oluşan bir dizi yapmak için yapabileceğiniz sayıları eklemeyi düşündüm.

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.