पूर्णांक की सरणी में स्ट्रिंग परिवर्तित करें


92

मैं निम्नलिखित स्ट्रिंग '14 2'को दो पूर्णांकों की एक सरणी में बदलना चाहता हूं । मैं यह कैसे कर सकता हूं ?

जवाबों:


88

आप स्ट्रिंग्स.split() की एक सरणी प्राप्त कर सकते हैं , फिर उन्हें इस तरह संख्याओं में बदलने के लिए लूप करें:

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

+myArray[i]बस एक त्वरित तरीका संख्या रूपांतरण करने के लिए है, यदि आप उन्हें अच्छी पूर्णांकों तुम सिर्फ कर सकते हैं कर रहे हैं:

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

5
छोटा: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;बिटवाइज रूपांतरण और छोटे लूपिंग का उपयोग करके
— vsync

1
या ES5 के साथ:myArray.forEach(function(x,y,z){ z[y]=x|0 })
— vsync

3
@vsync - निश्चित ... लेकिन जब कोई भी कंपाइलर इसे और भी कम करने जा रहा है, तो इसे दर्दनाक क्यों बनाए रखें? :) स्पष्टता कुछ अतिरिक्त बाइट्स के लायक है, खासकर जब यह वास्तव में बहुत लंबे समय तक नहीं होगा यदि एक बार नीचे गिरा दिया जाए।
— निक Craver

क्योंकि एक बार के लिए, मैं अपने प्रकाशित कोड को छोटा नहीं करता, इसलिए अन्य लोग मेरे कोड को पढ़ सकते हैं और देख सकते हैं कि क्या हो रहा है, और दूसरा, बिटवाइज़ ऑपरेशन पार्सइंट की तुलना में बहुत तेज़ हैं।
— vsync

5
@vsync - सुनिश्चित करें कि आप सभी ब्राउज़रों पर दावा करने वाले परीक्षण करते हैं, मुझे व्यक्तिगत रूप से + अधिक पठनीय लगता है ... और यदि आप परीक्षण करते हैं, तो अधिकांश नवीनतम ब्राउज़रों में एक नगण्य अंतर है, किसी भी तरह - इंजन पर निर्भर करता है। इसके अलावा, आप एक प्रस्ताव दे सकते हैं .min.jsऔर .jsयदि आप अपने कोड को उजागर करना चाहते हैं ... तो याद रखें कि minification अस्पष्टता के लिए नहीं है (या ऐसा नहीं होना चाहिए, क्योंकि यह उसके लिए बेकार है), यह HTTP ओवरहेड को कम करने के लिए है - एक तेज़ पृष्ठ लोड अपने उपयोगकर्ताओं के लिए।
— निक Craver

212

आधुनिक ब्राउज़रों के लिए एक त्वरित:

'14 2'.split(' ').map(Number);

// [14, 2]`

1
बहुत साफ तरीका है! अव्वल होना चाहिए।
— हेज़लनट

1
गेंदों। वह तो कमाल है। इतना ताजा और इतना साफ।
— टोड


1
अच्छा है, लेकिन यह वास्तव में कैसे काम कर रहा है? आप संख्या ऑब्जेक्ट में पास कर रहे हैं, लेकिन यह सुनिश्चित नहीं कर रहे हैं कि इसे कैसे परिवर्तित किया जाए। मुझे लगा कि आपको मानचित्र बनाने के लिए किसी फ़ंक्शन में पास होने की आवश्यकता है।
— जारग 7

2
हाँ, यह सही है। संख्या () नक्शा करने के लिए दिया गया फ़ंक्शन है, और यह मानों को परिवर्तित करता है। अधिक विवरण के लिए टोड के उत्तर की जाँच करें।
— xer0x

35

एसओ ... पुराना धागा, मुझे पता है, लेकिन ...

संपादित करें

@ रोकोमुसोलीनो की अच्छी पकड़ थी; यहाँ एक विकल्प है:

टी एल; डॉ:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

गलत :"5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

यहां सूचीबद्ध अधिक सुरुचिपूर्ण समाधानों में एक सूक्ष्म दोष है, विशेष रूप से @amillara और @Marcus 'अन्यथा सुंदर उत्तर।

समस्या तब होती है जब स्ट्रिंग सरणी का एक तत्व पूर्णांक जैसा नहीं होता है, शायद किसी इनपुट पर सत्यापन के बिना। एक आकस्मिक उदाहरण के लिए ...

समस्या:


var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN]

चूँकि आप स्पष्ट रूप से PURE int सरणी चाहते हैं, इसलिए यह एक समस्या है। ईमानदारी से , मैंने इसे तब तक नहीं पकड़ा जब तक मैंने अपनी स्क्रिप्ट में एसओ कोड को कॉपी नहीं किया ...: /


(थोड़ा-कम-baller) फिक्स:


var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69]

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

आशा है कि यह किसी को समय बचाता है!


1
टोटे बॉलर मेरे लिए काफी है। धन्यवाद, टोड!
— 18

5
ध्यान रखें, यदि आपके स्ट्रिंग में एक या अधिक 0. शून्य नहीं है, तो यह कार्य बूलियन = असत्य में होता है, इसलिए बूलियन फ़िल्टर इसे नहीं रखेगा।
— रोक्को मुसोलिनो

1
आप बदल सकते हैं .filter(Boolean)के साथ.filter( (x) => !Number.isNaN(x))
— Bob9630

26
var result = "14 2".split(" ").map(function(x){return parseInt(x)});

5
सभी ब्राउज़र इसका समर्थन नहीं करते हैं - यह IE में टूट जाएगा, यह एक जावास्क्रिप्ट 1.6+ सुविधा है। इसके अलावा, मैंने एक अन्य उत्तर पर कहा, हमेशा एक मूलांक पास करें parseInt()।
— निक Craver

2
मुझे बहुत उम्मीद है कि जब हम .mapअतिरिक्त पुस्तकालयों के बिना किसी भी ब्राउज़र में JS में उपयोग कर सकते हैं और समान कर सकते हैं ।
— JAL

5

तुषार गुप्ता का जवाब होगा:

'14 2'.split(' ').map(x=>+x);

// [14, 2]`

कोड गोल्फ में आप 1 कैरेक्टर सेव करते हैं। यहां "+" "यूनरी प्लस" ऑपरेटर है, पार्सइंट की तरह काम करता है।


3

पहले रिक्त स्थान पर स्ट्रिंग विभाजित करें:

var result = '14 2'.split(' ');

फिर स्ट्रिंग्स के परिणाम सरणी को पूर्णांकों में बदलें:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

2
आपको हमेशा एक मूलांक तर्क पास करना चाहिए parseInt(), अन्यथा आपको वहां अष्टक मिल सकता है।
— निक Craver

यदि तार के साथ शुरू नहीं होता है 0, या 0xयह ठीक होना चाहिए।
— मार्कस व्हाईब्रो

1
यदि वे नहीं देखते (कि आपने धारणा के साथ इसे कैसे उपसर्ग किया है?) ... तो उन सभी मामलों के लिए इसे सही करने के लिए 3 वर्ण क्यों जोड़ते हैं?
— निक Craver

3

के खिलाफ बिंदु parseInt-approach:

लैम्ब्डा का उपयोग करने और / या radixपैरामीटर देने की आवश्यकता नहीं है parseInt, बस उपयोग करें parseFloatया Numberइसके बजाय।


कारण:

  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. यह एक छोटा सा तेज है और कैश का फायदा उठाता है, जब 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'! >_<

सूचना: फ़ायरफ़ॉक्स में parseIntलगभग 4 गुना तेजी से काम होता है, लेकिन फिर भी यह दूसरों की तुलना में धीमा है। कुल में: +e< Number< parseFloat<parseInt


0

बस मज़े के लिए मैंने सोचा कि मैं forEach(f())भी एक समाधान फेंक दूंगा ।

var a=[];
"14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))});

// a = [14,2]

0
let idsArray = ids.split(',').map((x) => parseInt(x));

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
— बैदाकद्र

0

बेहतर एक लाइन समाधान:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

वह तार नहीं है।
— डेल्रो

-3

हमें विभाजित समारोह :

var splitresult = "14 2".split(" ");

3
यह संख्याओं की नहीं, स्ट्रिंग्स की एक सरणी प्राप्त करता है।
— निक Craver

ऑउप्स, हाँ, यह गलत है। बाकी के लिए मार्कस व्हाट्सब्रो या निक क्रेवर का जवाब देखें।
— प्रियंवद २ p
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.