2010-12-14 16 views
38

Otrzymuję tablicę po jakiejś manipulacji. Muszę przekonwertować wszystkie wartości tablicowe na liczby całkowite.Jak przekonwertować wszystkie elementy tablicy na liczbę całkowitą w JavaScript?

Mój przykładowy kod

var result_string='a,b,c,d|1,2,3,4'; 
    result=result_string.split("|"); 
    alpha=result[0]; 
    count=result[1]; 
    //alert(alpha); 
    //alert(count); 
    count_array=count.split(","); 

count_array zawiera teraz 1,2,3,4 ale muszę te wartości, aby być w całkowitych.

Użyłem parseInt(count_array);, ale to się nie udało. JS traktuje każdą wartość w tej tablicy jako ciąg znaków.

Odpowiedz

17

Trzeba pętli i analizowania/konwertowanie elementów w tablicy, tak:

var result_string = 'a,b,c,d|1,2,3,4', 
    result = result_string.split("|"), 
    alpha = result[0], 
    count = result[1], 
    count_array = count.split(","); 
for(var i=0; i<count_array.length;i++) count_array[i] = +count_array[i]; 
//now count_array contains numbers 

You can test it out here. Jeżeli +, rzuca, pomyśl o tym, jak:

for(var i=0; i<count_array.length;i++) count_array[i] = parseInt(count_array[i], 10); 
+3

Faktycznie, 'parseInt ("8foo", 10)' '8' powraca natomiast' + "8foo" '' NaN' powraca . Twoje podejście jest bardziej rygorystyczne w przypadku nieprawidłowych numerów, lubię to. –

+1

Mogę również zaproponować użycie czegoś takiego jak "74" >> 0', przesunięcie bitowe o zero. Czy praca dobrze, jest surowa i znacznie bardziej wydajna niż alternatywy. Drugą najlepszą opcją pod względem wydajności jest wykonanie operacji "not not": '~~" 74 "' –

+0

@RubenMartinezJr. Nie jest to takie ścisłe, ponieważ '" Nie liczba ">> 0 == 0' – Kian

7

Wystarczy pętli tablicy i konwertować elementy:

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

Nie zapomnij o drugi argument dla parseInt.

78

ECMAScript5 zapewnia metodę dla Array s, stosując funkcję do wszystkich elementów tablicy. Oto przykład:

var a = ['1','2','3']; 
var result = a.map(function (x) { 
    return parseInt(x, 10); 
}); 

Aby uzyskać więcej informacji, sprawdź https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map

+0

Czyste rozwiązanie. Dziękuję Ci! – eduludi

+5

W przypadku problemów ze zgodnością, należy pamiętać, że metoda Array.map() nie jest dostępna w IE8 i poniżej –

1

jQuery, można podoba map() method jak tak;

$.map(arr, function(val,i) { 
    return parseInt(val); 
}); 
50

Można zrobić

var arrayOfNumbers = arrayOfStrings.map(Number); 

dla starszych przeglądarek, które nie obsługują Array.map, można użyć Underscore

var arrayOfNumbers = _.map(arrayOfStrings, Number); 
+1

Very nice. Jeśli użyjesz podkreśleń (dla starych przeglądarek, które nie obsługują Array.map), możesz zrobić polecenie 'var newArray = _.map (oldArray, Number);' – rilwis

6

Punktem przeciwko parseInt, podejściem:

nie ma potrzeby korzystania z lambdy i/lub dać radix parametr do parseInt, wystarczy użyć parseFloat lub Number zamiast.


Przyczyny:

  1. to działa:

    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. Jest krótszy.

  3. To odrobinę quickier i korzysta z pamięci podręcznej, gdy parseInt, podejście - nie robi:

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

Wskazówka: W Firefoksie parseInt działa około 4 razy szybciej, ale wciąż wolniej niż inne. W sumie: +e < Number < parseFloat < parseInt

2

var arr = ["1", "2", "3"]; 
 
arr = arr.map(Number); 
 
console.log(arr); // [1, 2, 3]

+0

To jest poprawna odpowiedź, ale zasadniczo nie różni się od innej odpowiedzi na to pytanie, które już ma 47 przegranych. Ponadto odpowiedzi są znacznie bardziej pomocne, jeśli zawierają wyjaśnienie, co zamierza zrobić kod i dlaczego rozwiązuje problem bez wprowadzania innych. –

+0

@TomAranda Oops, moja zła ... to był mój pierwszy punkt odpowiedzi, więc mogłem być trochę zbyt chętny, aby umieścić moje 2 centy. Powinienem dokładnie przeczytać wszystkie odpowiedzi przed przesłaniem swoich. Dzięki za opinie! Będę pamiętał. – chzwzrd

Powiązane problemy