2013-03-28 41 views
94

मैं स्ट्रिंग नीचे है -कैसे संख्या की एक सरणी के लिए संख्या की एक स्ट्रिंग परिवर्तित करने के लिए?

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

जब मैं करता हूँ -

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

मैं b रूप ["1", "2", "3", "4"]

मैं b[1, 2, 3, 4] के रूप में प्राप्त करने के लिए कुछ कर सकते हैं?

उत्तर

238

आप Array.map का उपयोग एक संख्या में प्रत्येक तत्व कन्वर्ट करने के लिए कर सकते हैं।

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

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

चेक Docs


या अधिक सुंदर ढंग से के रूप में उपयोगकर्ता द्वारा ने कहा: thg435

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

कहाँ Number() आराम करना होगा: जाँच here


नोट: पुराने ब्राउज़र के लिए कि map का समर्थन नहीं करते हैं, तो आप एक कार्यान्वयन में जोड़ सकते हैं अपने आप को पसंद है:

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

[ "ट्रिकी उपयोग के मामले"] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map#Tricky_use_case) दस्तावेज में वास्तव में इस बारे में बातचीत विषय। – Antony

+48

या बस 'मानचित्र (संख्या)'। – georg

+0

नोट: सुनिश्चित करें कि आप उस लिंक में ब्राउज़र संस्करण की जांच करें, IE8 Array.map का समर्थन नहीं करता है। (आश्चर्य की बात है, एह?) –

12

+string एक नंबर करने के स्ट्रिंग को बदलने की कोशिश करेंगे। तो हर तत्व को बदलने के लिए Array.map समारोह का उपयोग करें।

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

+1 - '+ एल' उत्तम दर्जे का है। मानचित्र को इंगित करने के लिए – techfoobar

16

मानचित्र यह पूर्णांक के लिए:

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

map हर सरणी आइटम पर लग रहा है, बशर्ते समारोह को पास कर देता है और उस समारोह की वापसी मूल्यों के साथ एक सरणी देता है। map वर्ष ब्राउज़र में उपलब्ध नहीं है, लेकिन jQuery या underscore की तरह सबसे पुस्तकालयों एक क्रॉस ब्राउज़र संस्करण शामिल हैं।

या, यदि आप पसंद करते हैं छोरों:

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

+1 सभी ब्राउज़रों के लिए उपलब्ध नहीं है। –

3

एक संस्करण आप combiantion lodash library से _.map और _.ary तरीकों का उपयोग कर सकते हैं। पूरे परिवर्तन एक अधिक कॉम्पैक्ट हो जाएगा।

_.map(['6', '8', '10'], _.ary(parseInt, 1)); 
// → [6, 8, 10] 
0

lambdas उपयोग और/या parseInt को radix पैरामीटर दे, बस के बजाय parseFloat या Number उपयोग करने के लिए कोई ज़रूरत नहीं है: यहाँ official documentation से उदाहरण है।

कारण:

  1. यह काम कर रहा है:

    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. यह कम है।

  3. यह एक छोटा सा quickier है और कैश का लाभ लेता है, जब parseInt -approach - नहीं करता है:

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

नोटिस: Firefox में parseInt बारे में 4 गुना तेजी से काम करता है, लेकिन अभी भी दूसरों की तुलना में धीमी है। कुल में: +e < Number < parseFloat < parseInt

6

एक और अधिक कम समाधान: Number करने के लिए नक्शे और तर्क पारित:

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

2

अंडरस्कोर js तरीका है -

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

के बाद से सभी उत्तर NaN शामिल होने के लिए अनुमति देते हैं, मुझे लगता है मैं जोड़ना होगा जो आप कर सकते, तो आप जल्दी से नंबरों के लिए मिश्रित मूल्यों की एक सरणी कास्ट करना चाहते हैं सोचा।

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. 
संबंधित मुद्दे