পরিবর্তনশীল দৈর্ঘ্যের একটি স্ট্রিং তৈরি করুন, বারবার অক্ষর দ্বারা ভরাট


164

সুতরাং, আমার প্রশ্নটি এখানে এর জাভা ফর্মের অন্য কেউ জিজ্ঞাসা করেছে: জাভা - নির্দিষ্ট দৈর্ঘ্য সহ নির্দিষ্ট অক্ষর দ্বারা ভরাট একটি নতুন স্ট্রিং উদাহরণ তৈরি করুন। সব থেকে ভালো সমাধান?

। । । তবে আমি এর জাভাস্ক্রিপ্ট সমতুল্য খুঁজছি।

মূলত, আমি প্রতিটি ক্ষেত্রের "সর্বাধিক দৈর্ঘ্য" বৈশিষ্ট্যের উপর ভিত্তি করে "#" অক্ষর দিয়ে পাঠ্য ক্ষেত্রগুলিকে গতিশীলভাবে পূরণ করতে চাই। সুতরাং, যদি কোনও ইনপুট থাকে maxlength="3"তবে ক্ষেত্রটি "###" দিয়ে পূর্ণ হবে।

আদর্শভাবে জাভা এর মতো কিছু থাকবে StringUtils.repeat("#", 10);তবে এখন পর্যন্ত সর্বোত্তম বিকল্প যা আমি ভাবতে পারি তা হল সর্বাধিক দৈর্ঘ্য না পৌঁছানো অবধি "#" অক্ষরগুলি একবারে একবার জুড়ে দেওয়া এবং সংযুক্ত করা। এর চেয়ে আরও কার্যকর উপায় আছে এমন অনুভূতিটি আমি কাঁপতে পারি না।

কোন ধারনা?

এফওয়াইআই - আমি কেবল ইনপুটে একটি ডিফল্ট মান সেট করতে পারি না, কারণ "#" অক্ষরগুলির ফোকাসের উপর পরিষ্কার করা দরকার, এবং যদি ব্যবহারকারী কোনও মান প্রবেশ না করে তবে অস্পষ্টতার সাথে "রিফিল্ড" করা দরকার। এটি "রিফিল" পদক্ষেপ যার সাথে আমি উদ্বিগ্ন


1
আপনি কি কোনও ইনপুট ক্ষেত্রের পাঠ্যকে মাস্ক করার জন্য এটি করছেন?
Feisty আম

@ ম্যাথহেকক্স: না, এটি সর্বোচ্চ দৈর্ঘ্যের একটি ভিজ্যুয়াল প্রদর্শন প্রদান করা আরও বেশি। এই ক্ষেত্রে, এটি এমন এক নম্বর ফোন ক্ষেত্রের জন্য যা সংখ্যার 3 টি অংশে বিভক্ত। এটি প্রদর্শিত হবে যে প্রথম 2 ক্ষেত্রের জন্য 3 ডিজিট এবং শেষের দরকার 4 4.
ট্যালেমেন

উত্তর:


302

এটি করার সর্বোত্তম উপায় (যা আমি দেখেছি) তা হ'ল

var str = new Array(len + 1).join( character );

এটি প্রদত্ত দৈর্ঘ্যের সাথে একটি অ্যারে তৈরি করে এবং তারপরে পুনরাবৃত্তি করার জন্য প্রদত্ত স্ট্রিংয়ের সাথে এটি যোগ দেয়। .join()ফাংশন অ্যারে দৈর্ঘ্য উপাদান নির্ধারিত মান কিনা নির্বিশেষে সম্মান, এবং অনির্ধারিত মান খালি স্ট্রিং হিসাবে দেখা যায়।

আপনাকে পছন্দসই দৈর্ঘ্যে 1 যুক্ত করতে হবে কারণ বিভাজক স্ট্রিং অ্যারের উপাদানগুলির মধ্যে চলে যায় ।


এটা পেরেক। :) parseInt()অ্যারের আকারের জন্য এটি ব্যবহারের আগে আমাকে ইনপুট সর্বাধিক দৈর্ঘ্যের মানটি ব্যবহার করার কথা মনে রাখা দরকার । শুধু আমি যা খুঁজছিলাম। । । ধন্যবাদ!
ট্যালেমেন

11
দ্রষ্টব্য, এই সমাধানটি খুব ধীর। এটি দেখতে সেক্সি লাগছে তবে সম্ভবত এটি করার ভুল উপায়।
হোগান

23
repeatস্ট্রিং.প্রোটোটাইপটিতে নির্মিত নতুন ফাংশনটি এখন এটি পরিচালনা করে (ES6 +)
আলেকজএমএ

অসুস্থ সমাধান। এর জন্য ধন্যবাদ!
সি

156

একবার চেষ্টা করে দেখুন: পি

s = '#'.repeat(10)

document.body.innerHTML = s


4
এটি অবশ্যই ECMAScript of এর অংশ বলে মনে হচ্ছে এটি সহজতম বাস্তবায়ন, তবে স্বল্পতম সমর্থিত it's এটি এখন কেবলমাত্র ফায়ারফক্স, ক্রোম এবং সাফারির ডেস্কটপ সংস্করণে সমর্থিত।
ট্যালেমেন

5
আপনার যদি লোডাশ ব্যবহারে আপত্তি নেই তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন: _.repeat('*',10);
জেরাউড গ্রাটাকাপ

4
এটি এখন 2018 এবং ES6 সুপ্রতিষ্ঠিত - এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। বাবেল বা অনুরূপ কিছু ব্যবহার না করে তাদের জন্য লিগ্যাসি ব্রাউজারগুলিকে সমর্থন করার প্রয়োজনের ক্ষেত্রে, আপনি উপরে উল্লিখিত লোডাশ বা ব্যাকআপের জন্য পলিফিল ব্যবহার করতে পারেন।
সানটয়কয়েট

@ সানটকোয়েট আমি যতটা চাই, এখনও এমন লোক রয়েছে যাদের আইই 11 এবং অ্যাড্রয়েডের ওয়েবভিউয়ের সাথে লড়াই করতে হবে, যার মধ্যে দুটিও এই repeat()পদ্ধতিটিকে সমর্থন করে না । সেদিনের অপেক্ষায় থাকি যখন আমাকে আর সেগুলি সম্পর্কে চিন্তা করতে হবে না myself । ।
ট্যালিম্যান

দুর্ভাগ্যক্রমে, আই আই
লরেঞ্জো লেরেট

30

দুর্ভাগ্যক্রমে যদিও এখানে উল্লিখিত অ্যারে.জাইনের পদ্ধতির সংক্ষিপ্ত, এটি স্ট্রিং-কনটেস্টেশন ভিত্তিক প্রয়োগের চেয়ে প্রায় 10X ধীর। এটি বড় বড় স্ট্রিংগুলিতে বিশেষত খারাপ কাজ করে। সম্পূর্ণ কর্মক্ষমতা বিশদের জন্য নীচে দেখুন।

ফায়ারফক্স, ক্রোম, নোড.জেএস ম্যাকোস, নোড.জেএস উবুন্টু এবং সাফারিতে, আমি পরীক্ষিত দ্রুততম প্রয়োগটি হ'ল:

function repeatChar(count, ch) {
    if (count == 0) {
        return "";
    }
    var count2 = count / 2;
    var result = ch;

    // double the input until it is long enough.
    while (result.length <= count2) {
        result += result;
    }
    // use substring to hit the precise length target without
    // using extra memory
    return result + result.substring(0, count - result.length);
};

এটি ভার্জোজ, সুতরাং আপনি যদি অল্প বাস্তবায়ন চান তবে আপনি নিষ্পাপ পদ্ধতির সাথে যেতে পারেন; এটি এখনও অ্যারে.জয়েন পদ্ধতির চেয়ে বিটবিব 2 এক্স থেকে 10 এক্স আরও ভাল সম্পাদন করে এবং ছোট ইনপুটগুলির দ্বিগুণ বাস্তবায়নের চেয়েও দ্রুত। কোড:

// naive approach: simply add the letters one by one
function repeatChar(count, ch) {
    var txt = "";
    for (var i = 0; i < count; i++) {
        txt += ch;
    }
    return txt;
}

আরো তথ্য:


1
এটি আমার সমাধানের চেয়ে এখনও ধীরে ধীরে (2 থেকে 3 টি আকারের ক্রম দ্বারা) solution
হোগান

@ হোগান আপনার সমাধান কোথাও থেকে একটি পূর্ণ স্ট্রিং তৈরি করে না। আপনি এটি নিজে তৈরি করেন এবং তারপরে কেবল একটি স্ট্রিংগুলি বের করুন।
স্ট্যান ই

এই পদ্ধতিরটি নোড.জেএস-এ অ্যারের চেয়ে 10x কম ধীরে ধীরে স্ট্রিংয়ের জন্য s
আনশুল কোকা

21

আমি একটি ধ্রুব স্ট্রিং তৈরি করব এবং তারপরে এটিতে স্ট্রিং কল করব।

কিছুটা এইরকম

var hashStore = '########################################';

var Fiveup = hashStore.substring(0,5);

var Tenup = hashStore.substring(0,10);

কিছুটা দ্রুতও।

http://jsperf.com/const-vs-join


1
এটা খুব চালাক! এমনকি এটি একাধিক অক্ষরযুক্ত স্ট্রিং প্যাটার্নগুলির সাথেও কাজ করে।
মার্কাস

1
কেবল এই পৃষ্ঠাটি পুনর্বিবেচনা করা হচ্ছে কারণ মনে হচ্ছে এটি অনেক মনোযোগ পাচ্ছে এবং আপনার সমাধান সম্পর্কে মন্তব্য করতে চেয়েছিল। যদিও আমি অবশ্যই আপনার পদ্ধতির সরলতা এবং গতি পছন্দ করি, এটির সাথে আমার সবচেয়ে বড় উদ্বেগ ছিল রক্ষণাবেক্ষণ / পুনঃব্যবহার সম্পর্কে। আমার নির্দিষ্ট দৃশ্যে থাকাকালীন, জেনেরিক ফাংশন হিসাবে আমার 4 টিরও বেশি অক্ষরের প্রয়োজন ছিল না, একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং ব্যবহার করার অর্থ হল আপনার যদি ব্যবহারের ক্ষেত্রে আরও অক্ষর প্রয়োজন হয় তবে আপনাকে ফিরে এসে স্ট্রিংটি আপডেট করতে হবে। অন্য দুটি সমাধান সে ক্ষেত্রে আরও নমনীয়তার সুযোগ দেয়। যদিও গতির জন্য +1।
ট্যালেমেন

1
ওহ, এবং ফ্লিপ দিকে (এবং আমি বুঝতে পারি যে এটি আসলে একটি স্টাইলিস্টিক উদ্বেগের চেয়ে বেশি, একটি প্রোগ্রামাম্যাটিক হিসাবে), একটি 30+ অক্ষরের স্ট্রিং বজায় রাখা যা কেবলমাত্র 3-4 টি অক্ষরের জন্য ব্যবহৃত হবে তা ভালভাবে বসেনি with অমি ও না . । । আবার, বিভিন্ন ব্যবহারের ক্ষেত্রে সমাধানের নমনীয়তার চারপাশে একটি ছোটখাটো সমস্যা।
ট্যালেমেন

আইটি-তে ট্যালেমিন সবকিছুই একটি বাণিজ্য বন্ধ। একটি 4 টি অক্ষরের স্ট্রিং রয়েছে এবং এটি আরও বড় করুন বা 30 টি অক্ষরের স্ট্রিং রয়েছে এবং উদ্বেগের দরকার নেই। সব মিলিয়ে, কোনও আকারের একটি ধ্রুব স্ট্রিং - এমনকি 1 ক, আধুনিক মেশিনগুলিতে ক্ষুদ্র সংস্থান ব্যবহার।
হোগান

@ হোগান - সম্পূর্ণ সম্মত । । এবং, এটি আসলে সেই কারণের অংশ যা আমি গতির উপরেও খুব বেশি জোর দিইনি। আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে, আমি তিনটি স্ট্রিংয়ের সন্ধান করছিলাম যা দৈর্ঘ্যে 3, 3 এবং 4 টি অক্ষর ছিল। পয়েন্টির সমাধানটি সবচেয়ে ধীর ছিল, যেহেতু স্ট্রিংগুলি সংক্ষিপ্ত ছিল এবং সেগুলির মধ্যে খুব কম ছিল, তাই আমি তার সাথে গেলাম কারণ আমি এটি পছন্দ করি যে এটি প্রবাহিত, সহজেই পঠনযোগ্য এবং সহজেই বজায় রাখা যায়। শেষ পর্যন্ত, তারা প্রশ্নের বিভিন্ন পরিবর্তনের জন্য সমস্ত ভাল সমাধান। । । এটি আপনার নির্দিষ্ট পরিস্থিতির জন্য অগ্রাধিকারগুলি কী তার উপর নির্ভর করে।
ট্যালিম্যান


5

একটি দুর্দান্ত ES6 বিকল্পটি padStartখালি স্ট্রিংয়ের জন্য হবে। এটার মত:

var str = ''.padStart(10, "#");

দ্রষ্টব্য: এটি IE (পলিফিল ছাড়াই) কাজ করবে না।


3
বিশেষত যে কোনও কারণের জন্য আপনি s = '#'.repeat(10)উপরের @ ব্যবহারকারীর 22227915 এর উত্তর থেকে অন্যটি ( ) এর উপর এই ES6 পদ্ধতির সুপারিশ করবেন ?
ট্যালেমিন

@ ট্যালেমিন সরল বাক্য গঠন
মেন্ডি

3

সমস্ত ব্রাউজারে কাজ করে এমন সংস্করণ

এই ফাংশনটি আপনি যা চান তা করেন এবং গৃহীত উত্তরের প্রস্তাবিত বিকল্পের চেয়ে অনেক দ্রুত সম্পাদন করে:

var repeat = function(str, count) {
    var array = [];
    for(var i = 0; i <= count;)
        array[i++] = str;
    return array.join('');
}

আপনি এটি এর মতো ব্যবহার করুন:

var repeatedCharacter = repeat("a", 10);

গৃহীত উত্তরে প্রস্তাবিত বিকল্পটির সাথে এই ফাংশনটির পারফরম্যান্স তুলনা করতে, এই ফিডল এবং এই ফিডলটি দেখুন বেঞ্চমার্কের জন্য ।

শুধুমাত্র আধুনিক ব্রাউজারগুলির জন্য সংস্করণ

আধুনিক ব্রাউজারগুলিতে আপনি এখন এটি করতে পারেন:

var repeatedCharacter = "a".repeat(10) };

এই বিকল্পটি আরও দ্রুত। তবে দুর্ভাগ্যক্রমে এটি ইন্টারনেট এক্সপ্লোরারের কোনও সংস্করণে কাজ করে না।

সারণীতে থাকা সংখ্যাগুলি প্রথম ব্রাউজার সংস্করণ নির্দিষ্ট করে যা পদ্ধতিটিকে পুরোপুরি সমর্থন করে:

এখানে চিত্র বর্ণনা লিখুন


3
For Evergreen browsers, this will build a staircase based on an incoming character and the number of stairs to build.
function StairCase(character, input) {
    let i = 0;
    while (i < input) {
        const spaces = " ".repeat(input - (i+1));
        const hashes = character.repeat(i + 1);
        console.log(spaces + hashes);
        i++;
    }
}

//Implement
//Refresh the console
console.clear();
StairCase("#",6);   

আপনি পুরানো ব্রাউজারগুলির জন্য পুনরাবৃত্তের জন্য একটি পলিফিল যোগ করতে পারেন

    if (!String.prototype.repeat) {
      String.prototype.repeat = function(count) {
        'use strict';
        if (this == null) {
          throw new TypeError('can\'t convert ' + this + ' to object');
        }
        var str = '' + this;
        count = +count;
        if (count != count) {
          count = 0;
        }
        if (count < 0) {
          throw new RangeError('repeat count must be non-negative');
        }
        if (count == Infinity) {
          throw new RangeError('repeat count must be less than infinity');
        }
        count = Math.floor(count);
        if (str.length == 0 || count == 0) {
          return '';
        }
        // Ensuring count is a 31-bit integer allows us to heavily optimize the
        // main part. But anyway, most current (August 2014) browsers can't handle
        // strings 1 << 28 chars or longer, so:
        if (str.length * count >= 1 << 28) {
          throw new RangeError('repeat count must not overflow maximum string size');
        }
        var rpt = '';
        for (;;) {
          if ((count & 1) == 1) {
            rpt += str;
          }
          count >>>= 1;
          if (count == 0) {
            break;
          }
          str += str;
        }
        // Could we try:
        // return Array(count + 1).join(this);
        return rpt;
      }
    } 

2

হোগান এবং জিরো ট্রিক পনি থেকে প্রাপ্ত উত্তরগুলির ভিত্তিতে। আমি মনে করি এটি বেশিরভাগ ব্যবহারের ক্ষেত্রে হ্যান্ডেল করার জন্য যথেষ্ট দ্রুত এবং নমনীয় হওয়া উচিত:

var hash = '####################################################################'

function build_string(length) {  
    if (length == 0) {  
        return ''  
    } else if (hash.length <= length) {  
        return hash.substring(0, length)  
    } else {  
        var result = hash  
        const half_length = length / 2  
        while (result.length <= half_length) {  
            result += result  
        }  
        return result + result.substring(0, length - result.length)  
    }  
}  

কোড স্নিপেট নিজেই কোনও উত্তর সরবরাহ না করায় আপনার উত্তরটিতে আরও কিছু ব্যাখ্যা যুক্ত করুন।
ক্লাইজস্টাররা 15

@ ল্যান্ড্রো চালাক এবং প্রক্রিয়াকরণ হ্রাস! +1
এলএমএসিংহ

আমি মনে করি আপনি হ্যাশ দৈর্ঘ্য> = দৈর্ঘ্য
সিপাক

1

আপনি যদি পছন্দ করেন তবে ফাংশনের প্রথম লাইনটি ওয়ান-লাইনার হিসাবে ব্যবহার করতে পারেন:

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.