স্ট্রিংকে পূর্ণসংখ্যার অ্যারেতে রূপান্তর করুন


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

4
সংক্ষিপ্ত: for(var i=myArray.length; i--;) myArray[i] = myArray[i]|0;বিটওয়াইজ রূপান্তর এবং সংক্ষিপ্ত লুপিং ব্যবহার করে
vsync

4
অথবা ES5 সহ:myArray.forEach(function(x,y,z){ z[y]=x|0 })
vsync

4
@vsync - অবশ্যই ... তবে যখন কোনও সংকলক এটির চেয়েও আরও ছোট করে তুলছে তখন কেন এটি বেদনাদায়ক করে তুলবেন? :) স্পষ্টতা কয়েক অতিরিক্ত বাইট মূল্যবান, বিশেষত যখন এটি একবারে নিচে নামিয়ে দেওয়া হয় আসলে এটি আর বেশি দীর্ঘতর হয় না।
নিক ক্র্যাভার

কারণ একবারের জন্য, আমি আমার প্রকাশিত কোডটি মিনিমাইটি করি না, যাতে অন্যরা আমার কোডটি পড়তে পারে এবং কী ঘটছে তা দেখতে পারে এবং দ্বিতীয়ত, বিটওয়াইস ক্রিয়াকলাপগুলি পার্সেন্টের চেয়ে অনেক দ্রুত।
vsync

4
@vsync - আপনি নিশ্চিত হয়ে নিন যে আপনি সমস্ত ব্রাউজার জুড়ে সেই দাবিটি পরীক্ষা করেছেন, আমি ব্যক্তিগতভাবে + আরও বেশি পঠনযোগ্য বলে মনে করি ... এবং যদি আপনি পরীক্ষা করেন তবে বেশিরভাগ সর্বশেষতম ব্রাউজারগুলি ইঞ্জিনের উপর নির্ভর করে উভয় উপেক্ষিতই তুচ্ছ difference এছাড়াও, আপনি একটি অফার দিতে পারেন .min.jsএবং .jsযদি আপনি আপনার কোডটি প্রকাশ করতে চান ... মনে রাখবেন যে এই সংশোধনটি অস্পষ্টতার জন্য নয় (বা এটি হওয়া উচিত নয়, কারণ এটি এর জন্য অকেজো সম্পর্কে নয়), এটি HTTP ওভারহেড হ্রাস করার জন্য - একটি দ্রুত পৃষ্ঠা লোড আপনার ব্যবহারকারীদের জন্য।
নিক ক্র্যাভার

213

আধুনিক ব্রাউজারগুলির জন্য একটি দ্রুত:

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

// [14, 2]`

4
খুব পরিষ্কার উপায়! শীর্ষ হতে হবে।
হ্যাজেলনাট

4
বল সেটা খুবই ভালো. তাই টাটকা এবং তাই পরিষ্কার।
টড


4
সুন্দর, তবে এটি আসলে কীভাবে কাজ করছে? আপনি নম্বর অবজেক্টে পাস করছেন তবে এটি কীভাবে রূপান্তরিত হবে তা আমি নিশ্চিত নই। আমি ভেবেছিলাম আপনাকে ম্যাপ করার জন্য কোনও ফাংশন পেরিয়ে যাওয়া দরকার।
জার্গ 7

4
হ্যাঁ, ঠিক আছে সংখ্যা () হ'ল মানচিত্রে ফাংশনটি উত্তীর্ণ হয় এবং এটি মানগুলিকে রূপান্তর করে। আরও তথ্যের জন্য টডের উত্তর দেখুন।
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]

এখানে তালিকাভুক্ত আরও মার্জিত সমাধানগুলির একটি সূক্ষ্ম ত্রুটি রয়েছে, বিশেষত @ আমিলারা এবং @ মারকাস 'অন্যথায় সুন্দর উত্তর।

সমস্যাটি ঘটে যখন স্ট্রিং অ্যারের কোনও উপাদান পূর্ণসংখ্যার মতো না হয়, সম্ভবত কোনও ইনপুটটিতে বৈধতা ছাড়াই। স্বীকৃত উদাহরণের জন্য ...

সমস্যাটি:


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

যেহেতু আপনি অবশ্যই একটি নির্ভেজাল অ্যারে চান, এটি একটি সমস্যা want সত্যি বলতে , আমি আমার স্ক্রিপ্টে এসও কোড অনুলিপি না করা পর্যন্ত আমি এটি ধরিনি ...: /


(সামান্য-কম Baller) ফিক্স:


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

সুতরাং, এখন আপনার যখন ক্রেপ ইন্ট স্ট্রিং রয়েছে তখনও আপনার আউটপুটটি খাঁটি পূর্ণসংখ্যা অ্যারে। অন্যরা বেশিরভাগ ক্ষেত্রে সত্যিই সেক্সি, তবে আমি আমার বেশিরভাগ অস্পষ্টতার সাথে প্রস্তাব দিতে চাইতাম না । আমার কৃতিত্বের হিসাবে এটি এখনও এক-লাইনার ...

আশা করি এটি কারও সময় বাঁচায়!


4
টোটস আমার জন্য যথেষ্ট পরিমাণে বেলার ধন্যবাদ, টড!
অনিশ্চিত

4
সতর্কতা অবলম্বন করুন, যদি আপনার স্ট্রিংয়ে এক বা একাধিক 0 থাকে তবে এটি কাজ করবে না শূন্যটি একটি বুলিয়ান = মিথ্যাতে অনুবাদ করুন, সুতরাং বুলিয়ান ফিল্টার এটি রাখবে না।
রোকো মুসোলিনো

4
আপনি প্রতিস্থাপন করতে পারেন .filter(Boolean)সঙ্গে.filter( (x) => !Number.isNaN(x))
Bob9630

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

4
সমস্ত ব্রাউজারগুলি এটি সমর্থন করে না - এটি আই-তে ভাঙ্গবে, এটি একটি জাভাস্ক্রিপ্ট 1.6+ বৈশিষ্ট্য। এছাড়াও, আমি অন্য উত্তরে বলেছি, সর্বদা একটি রেডিক্স এতে পাস করুন parseInt()
নিক Craver

4
আমি তখন অপেক্ষা করি যখন আমরা .mapকোনও লাইব্রেরি ছাড়াই যে কোনও ব্রাউজারে জেএসে ব্যবহার করতে এবং অনুরূপ করতে পারি ।
জাল

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

4
আপনার সর্বদা একটি রেডিক্স যুক্তিটি পাস করা উচিত parseInt(), অন্যথায় আপনি সেখানে অষ্টাল পেতে পারেন।
নিক Craver

যদি স্ট্রিংগুলি শুরু না হয় 0, বা 0xএটি ভাল হওয়া উচিত।
মার্কাস হোয়ব্রো

4
যদি তারা না দেয় (দেখুন আপনি কীভাবে অনুমানের সাথে এটি উপস্থাপিত করেছিলেন?) ... কেন এই তিনটি ক্ষেত্রে এটি সঠিক করতে 3 টি অক্ষর যুক্ত করবেন?
নিক Craver

3

parseInt-প্রশ্নের বিরুদ্ধে বিন্দু :

ল্যাম্বডাস এবং / অথবা 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-প্রশিক্ষণ - না :

      // 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(" ");

4
এটি স্ট্রিংগুলির একটি অ্যারে পায়, সংখ্যা নয়।
নিক Craver

ওহুপস, হ্যাঁ, এটি ভুলভাবে লিখুন। বাকিগুলির জন্য মার্কাস হোয়ব্রো বা নিক ক্র্যাভারের উত্তরটি দেখুন।
পাইভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.