बार-बार चरित्र एन टाइम्स


602

पर्ल में मैं वाक्यविन्यास का उपयोग करते हुए एक चरित्र को कई बार दोहरा सकता हूं:

$a = "a" x 10; // results in "aaaaaaaaaa"

क्या जावास्क्रिप्ट में इसे पूरा करने का एक सरल तरीका है? मैं स्पष्ट रूप से एक फ़ंक्शन का उपयोग कर सकता हूं, लेकिन मैं सोच रहा था कि क्या कोई दृष्टिकोण या किसी अन्य चतुर तकनीक में बनाया गया था।

जवाबों:


1201

इन दिनों, repeatस्ट्रिंग विधि लगभग हर जगह लागू की गई है। (यह इंटरनेट एक्सप्लोरर में नहीं है ।) इसलिए जब तक आपको पुराने ब्राउज़रों का समर्थन करने की आवश्यकता नहीं है, आप बस लिख सकते हैं:

"a".repeat(10)

इससे पहले repeat, हमने इस हैक का उपयोग किया था:

Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"

(ध्यान दें कि 11 की लंबाई वाली सरणी आपको केवल 10 "ए" मिलती है, क्योंकि सरणी तत्वों के बीचArray.join तर्क देता है ।)

साइमन यह भी बताते हैं कि इस jsperf के अनुसार , ऐसा प्रतीत होता है कि यह सफारी और क्रोम (लेकिन फ़ायरफ़ॉक्स नहीं) में तेज़ है, एक चरित्र को कई बार दोहराने के लिए केवल लूप (हालांकि थोड़ा कम संक्षिप्त) का उपयोग करके।


4
इसके अलावा, आप एक निश्चित लंबाई के बजाय एक चर का उपयोग कर सकते हैं - ऐरे (20-लेन), 20 तक एक स्ट्रिंग पैड करने के लिए कहें।
जॉन सी।

7
लूप विधि तेज हो सकती है लेकिन इसकी अधिक क्रिया है। इसके अलावा, मैं पहली टिप्पणी के लिए सभी upvotes से हैरान हूँ, यह देखते हुए कि जब यह आम तौर पर उपयोगी होने वाला होता है जब ऐरे की लंबाई परिवर्तनशील होती है, जैसेArray(rawValue.length + 1).join("*")
Dexygen

यह 0 और 1 मामले में काम नहीं करता है, क्योंकि वे समान परिणाम देते हैं।
रयान

2
सूत्र है Array(n+1).join("a")। जब n = 0, यह खाली स्ट्रिंग लौटाता है, और जब n = 1 होता है, तो यह वापस आ जाता है "a"। इसलिए मुझे लगता है कि यह सभी मामलों में काम करता है।
जेसन ओरेंडोर्फ

1
@ नील ऐसा इसलिए है क्योंकि JS इंजन स्ट्रिंग की लंबाई पर एक सीमा लगाते हैं। क्रोम और फ़ायरफ़ॉक्स में, सीमा 2 ^ 30 (एक बिलियन) के करीब है। 10 ^ 12 एक ट्रिलियन है।
जेसन ओरेंडोर्फ

301

एक नए ES6 सद्भाव में, आपके पास दोहराने के साथ ऐसा करने का मूल तरीका होगा । इसके अलावा ES6 अभी केवल प्रयोगात्मक है, यह सुविधा पहले से ही एज, एफएफ, क्रोम और सफारी में उपलब्ध है

"abc".repeat(3) // "abcabcabc"

और निश्चित रूप से अगर रिपीट फंक्शन उपलब्ध नहीं है तो आप पुराने-अच्छे इस्तेमाल कर सकते हैं Array(n + 1).join("abc")


54

सुविधाजनक यदि आप अपने आप को बहुत दोहराते हैं:

String.prototype.repeat = String.prototype.repeat || function(n){
  n= n || 1;
  return Array(n+1).join(this);
}

alert(  'Are we there yet?\nNo.\n'.repeat(10)  )


53
यह बिलिन के प्रोटोटाइप को प्रदूषित करने के लिए एक खराब कोडिंग अभ्यास है।
tuomassalo

3
@nurettin अधिक चर्चा के लिए प्रोग्रामर .stackexchange.com/questions/104320/… देखें । मैं एक (ठीक से स्कूप किया हुआ) स्थैतिक सहायक कार्य जोड़ूंगा, जिसके हस्ताक्षर के साथ repeat(str, n)
तुमास्सला

4
मैं n= n || 1हिस्सा निकाल दूंगा (या यदि nअपरिभाषित है तो जांच लें ), ताकि आप भी बार- 0बार दोहरा सकें ।
चोदोरोविज़

3
ES6 के लिए मोज़िला की आधिकारिक पॉलीफ़िल पर भी नज़र डालें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Eirik Birkeland

3
@ क्रिस, String.repeatकेवल ईएस 6 में जोड़ा गया था, जिसे जून 2015 तक अंतिम रूप नहीं दिया गया था। इसलिए मुझे लगता है कि मेरी बात तब मान्य थी जब मैंने इसे 2012 में लिखा था। :)
tuomassalo

13

सबसे प्रदर्शन-पासा तरीका https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat है।

लघु संस्करण नीचे है।

  String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
      if (count & 1) result += pattern;
      count >>>= 1, pattern += pattern;
    }
    return result + pattern;
  };
  var a = "a";
  console.debug(a.repeat(10));

मोज़िला से पॉलीफ़िल:

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

यह एक अच्छा है, लेकिन नया देशी "रिपीट" और भी तेज है और इसके कार्यान्वयन की आवश्यकता नहीं है, वैसे भी धन्यवाद!
गोटी मेटल

1
आप के अर्थ पर विस्तृत कर सकते हैं count >>>= 1, pattern += pattern;? यह किस प्रकार का कथन है?
त्सही अशेर

तो यह मूल दोहराने के लिए एक पॉलीफ़िल है, फिर? बस if (!String.prototype.repeat) {शुरुआत और }अंत में एक जोड़ें ।
त्रिकली

>>> = अहस्ताक्षरित सही शिफ्ट असाइनमेंट है (जैसा कि गिनती = गिनती >>> 1 में) देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1441004

12

एक विकल्प है:

for(var word = ''; word.length < 10; word += 'a'){}

यदि आपको कई वर्ण दोहराने की आवश्यकता है, तो अपनी सशर्त गुणा करें:

for(var word = ''; word.length < 10 * 3; word += 'foo'){}

नोट: आपको 1 के साथ ओवरशूट करने की आवश्यकता नहीं हैword = Array(11).join('a')


10

यदि आप अपने प्रोजेक्ट में लाइब्रेरी शामिल करने का विरोध नहीं कर रहे हैं, तो लॉश में एक रिपीट फंक्शन है।

_.repeat('*', 3);
// → '***

https://lodash.com/docs#repeat


10

सभी ब्राउज़रों के लिए

निम्नलिखित फ़ंक्शन स्वीकृत उत्तर में सुझाए गए विकल्प की तुलना में बहुत तेज़ प्रदर्शन करेगा:

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

आप इसे इस तरह उपयोग करेंगे:

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

स्वीकार किए गए उत्तर में प्रस्तावित विकल्प के साथ इस फ़ंक्शन के प्रदर्शन की तुलना करने के लिए, इस फिडेल और बेंचमार्क के लिए इस फ़िडल को देखें।

आधुनिक ब्राउज़रों के लिए ही

आधुनिक ब्राउज़रों में, अब आप इस String.prototype.repeatविधि का उपयोग कर सकते हैं :

var repeatedString = "a".repeat(10);

एमडीएन पर इस विधि के बारे में और पढ़ें ।

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

यहाँ छवि विवरण दर्ज करें


9
Array(10).fill('a').join('')

हालांकि सबसे अधिक मतदान का जवाब थोड़ा अधिक कॉम्पैक्ट है, इस दृष्टिकोण के साथ आपको एक अतिरिक्त सरणी आइटम नहीं जोड़ना है।


1
दुर्भाग्य से, भरने की विधि IE में समर्थित नहीं है, और यदि आप IE कॉम्पेटिबल नहीं हैं, तो आप बस दोहराने विधि का उपयोग कर सकते हैं।
Michiel

1
fill()यदि आप join("a")अकेले ही ऐसा करते हैं तो आप अतिरिक्त विधि का उपयोग क्यों करेंगे ...
vsync

7
/**  
 * Repeat a string `n`-times (recursive)
 * @param {String} s - The string you want to repeat.
 * @param {Number} n - The times to repeat the string.
 * @param {String} d - A delimiter between each string.
 */

var repeat = function (s, n, d) {
    return --n ? s + (d || "") + repeat(s, n, d) : "" + s;
};

var foo = "foo";
console.log(
    "%s\n%s\n%s\n%s",

    repeat(foo),        // "foo"
    repeat(foo, 2),     // "foofoo"
    repeat(foo, "2"),   // "foofoo"
    repeat(foo, 2, "-") // "foo-foo"
);

7

ES2015 / ES6 में आप उपयोग कर सकते हैं "*".repeat(n)

तो बस इसे अपनी परियोजनाओं में जोड़ें, और आपका जाना अच्छा है।

  String.prototype.repeat = String.prototype.repeat || 
    function(n) {
      if (n < 0) throw new RangeError("invalid count value");
      if (n == 0) return "";
      return new Array(n + 1).join(this.toString()) 
    };

SCRIPT5029: इस दृष्टिकोण का उपयोग करते समय ऐरे की लंबाई एक परिमित धनात्मक पूर्णांक होनी चाहिए
andrepaulo

5

एन वर्ण को जल्दी से दोहराने का एक और दिलचस्प तरीका त्वरित घातांक एल्गोरिथ्म से विचार का उपयोग करना है:

var repeatString = function(string, n) {
    var result = '', i;

    for (i = 1; i <= n; i *= 2) {
        if ((n & i) === i) {
            result += string;
        }
        string = string + string;
    }

    return result;
};

आप "दिलचस्प तरीका" क्यों कहते हैं? यहाँ क्या दिलचस्प है? यह स्पष्ट रूप से समाधान है, कंप्यूटर प्रोग्राम का सबसे बुनियादी मौलिक उदाहरण है।
vsync

2

अपनी परियोजनाओं में एक मान दोहराने के लिए मैं रिपीट का उपयोग करता हूं

उदाहरण के लिए:

var n = 6;
for (i = 0; i < n; i++) {
    console.log("#".repeat(i+1))
}

लेकिन सावधान रहें क्योंकि इस पद्धति को ECMAScript 6 विनिर्देशन में जोड़ा गया है।


2
function repeatString(n, string) {
  var repeat = [];
  repeat.length = n + 1;
  return repeat.join(string);
}

repeatString(3,'x'); // => xxx
repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹"

1

यहाँ मेरा उपयोग है:

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

0

मैं @ bonbon के उत्तर पर विस्तार करने जा रहा हूं । उसकी विधि "मौजूदा वर्ण के लिए एन चार्ट को जोड़ने" का एक आसान तरीका है, बस अगर किसी को ऐसा करने की आवश्यकता होती है। उदाहरण के लिए चूंकि "एक google" एक 1 है जिसके बाद 100 शून्य हैं

for(var google = '1'; google.length < 1 + 100; google += '0'){}
document.getElementById('el').innerText = google;
<div>This is "a google":</div>
<div id="el"></div>

नोट: आपको सशर्त में मूल स्ट्रिंग की लंबाई को जोड़ना होगा।



0
var stringRepeat = function(string, val) {
  var newString = [];
    for(var i = 0; i < val; i++) {
      newString.push(string);
  }
  return newString.join('');
}

var repeatedString = stringRepeat("a", 1);

0

एक-लाइनर के रूप में भी इस्तेमाल किया जा सकता है:

function repeat(str, len) {
    while (str.length < len) str += str.substr(0, len-str.length);
    return str;
}

किसी भी प्रतियोगिता पर "के लिए" "जबकि" से अधिक तेज है। :-)
जूनुन


0

यह है कि आप किसी फ़ंक्शन को कैसे कॉल कर सकते हैं और एरे की मदद से परिणाम प्राप्त कर सकते हैं () और शामिल हों ()

function repeatStringNumTimes(str, num) {
  // repeat after me
  return num > 0 ? Array(num+1).join(str) : "";
}

console.log(repeatStringNumTimes("a",10))


-1
String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''); };

// console.log("0".repeat(3) , "0".repeat(-3))
// return: "000" "000"

1
यह ओवरराइट करता है String.prototype.repeatजो मूल रूप से वर्तमान ब्राउज़रों में शामिल है। इसके अलावा, इसे क्यों छोटा करें? आपको यह सब एक पंक्ति में लिखने की आवश्यकता नहीं है।
ब्लेंडर

IE में कोई 'दोहराव' सुविधा नहीं है, इसलिए प्रोटोटाइप की आवश्यकता है।
कैगेलन एएलटीआईएनसी

-3

यहाँ एक ES6 संस्करण है

const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|");
repeat("A",20).forEach((a,b) => console.log(a,b+1))

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