एक विशिष्ट सूचकांक पर एक स्ट्रिंग डालें


333

मैं एक स्ट्रिंग को दूसरे स्ट्रिंग के विशिष्ट सूचकांक में कैसे सम्मिलित कर सकता हूं?

 var txt1 = "foo baz"

मान लीजिए कि मैं "फू" के बाद "बार" सम्मिलित करना चाहता हूं, तो मैं इसे कैसे प्राप्त कर सकता हूं?

मैंने सोचा था substring(), लेकिन आगे और अधिक सरल और आसान तरीका होना चाहिए।


जवाबों:


257

आप अपने खुद के splice()स्ट्रिंग में प्रोटोटाइप कर सकते हैं ।

polyfill

if (!String.prototype.splice) {
    /**
     * {JSDoc}
     *
     * The splice() method changes the content of a string by removing a range of
     * characters and/or adding new characters.
     *
     * @this {String}
     * @param {number} start Index at which to start changing the string.
     * @param {number} delCount An integer indicating the number of old chars to remove.
     * @param {string} newSubStr The String that is spliced in.
     * @return {string} A new string with the spliced substring.
     */
    String.prototype.splice = function(start, delCount, newSubStr) {
        return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
    };
}

उदाहरण

String.prototype.splice = function(idx, rem, str) {
    return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};

var result = "foo baz".splice(4, 0, "bar ");

document.body.innerHTML = result; // "foo bar baz"


संपादित करें: यह सुनिश्चित करने के लिए इसे संशोधित किया है कि remएक निरपेक्ष मूल्य है।


6
मुझे पता है कि यह 2010 से है, लेकिन नीचे का sliceसमाधान बेहतर और सरल है। (स्प्लिट विनाशकारी है, स्लाइस नहीं है, और "आप जिन वस्तुओं को नहीं जानते हैं" को संशोधित करने से बचना बेहतर है)। यह समाधान निश्चित रूप से पहला दिखाई देने वाला उत्तर नहीं होना चाहिए, भले ही उस समय यह समझ में आया हो।
इरिक बिर्कलैंड

6
@ ईरिकबिरलैंड: स्ट्रिंग्स अपरिवर्तनीय हैं। उपरोक्त कोड किसी भी वस्तु को संशोधित नहीं करता है। किसी भी तरह से, "आप जिन वस्तुओं को नहीं जानते हैं " को संशोधित करने की आपकी धारणा " ऐरे म्यूटेशन" तरीकों को छोड़ देगी। तुम कह आप बल्कि करना चाहते हैं my_array[my_array.length] = itemके बजाय my_array.push(item)?

4
क्षमा करें, मेरा मतलब था "ऑब्जेक्ट्स आप अपने आप को नहीं"। आप spliceइस मामले में सही हैं ; वास्तव में तार अपरिवर्तनीय हैं। इस कारण से मुझे लगता spliceहै कि एक खराब कुंजी शब्द विकल्प है। जब तक वे मानक पॉलीफ़िल नहीं होते, तब तक मेरी मुख्य आपत्ति मनमाने ढंग से प्रोटोटाइप का विरोध करने के खिलाफ है।
इरिक बिर्कलैंड

1
यह अंतर्निहित वस्तुओं को संशोधित करने के लिए अविश्वसनीय रूप से बुरा अभ्यास है। जैसा कि हमने SmooshGate के साथ देखा , इस कोड को नई कार्यक्षमता के रूप में आपके कोड को तोड़ने का जोखिम भाषा में जोड़ा जाता है और, क्या आपके गैर-जिम्मेदार संशोधन को किसी पुस्तकालय में जाना चाहिए जो पूरे वेब पर महत्वपूर्ण बदलाव देखता है, यह एक सरल, स्पष्ट विधि के उपयोग को अवरुद्ध कर सकता है नई कार्यक्षमता के लिए।
शॉन

401

एक विशिष्ट सूचकांक में सम्मिलित (बजाय, पहले स्थान के चरित्र पर) स्ट्रिंग स्लिंग / प्रतिस्थापन का उपयोग करना होगा:

var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);

4
@AlejandroSalamancaMazuelo: substringयहाँ ठीक रहेगा। मैं sliceसामान्य रूप से पसंद करता हूं क्योंकि यह अधिक लचीला (नकारात्मक सूचकांक, उदाहरण के लिए "foo baz".slice(1, -2)) है। यह थोड़ा छोटा है, इसके लायक है थोड़ा।
टिम डाउन

8
क्या ES6 एक बेहतर विकल्प प्रदान करता है? कम से कम स्ट्रिंग इंटरपोलेशन का उपयोग कर सकता है, जैसे`${txt1.slice(0,3)}bar${txt1.slice(3)}`
Jay

1
यह उपरोक्तdelete में शामिल की गई सुविधा का उपयोग नहीं करता है; शीर्ष उत्तर ...
श्री पॉलीविरल

11
@ Mr.Polywhirl: नहीं। सवाल यह है कि ऐसा करने की आवश्यकता का कोई उल्लेख नहीं है।
टिम डाउन

133

यहाँ एक विधि है जो मैंने लिखी है जो अन्य सभी प्रोग्रामिंग भाषाओं की तरह व्यवहार करती है:

String.prototype.insert = function(index, string) {
  if (index > 0)
  {
    return this.substring(0, index) + string + this.substring(index, this.length);
  }

  return string + this;
};

//Example of use:
var something = "How you?";
something = something.insert(3, " are");
console.log(something)

संदर्भ:


1
आपको इफ {}-ब्लॉक के लिए घुंघराले ब्रेसिज़ जोड़ने की आवश्यकता हो सकती है ।
श्री-आईडीई

3
नहीं, जरूरत नहीं है लेकिन elseबेमानी है।
बिटरब्लू

72

बस निम्नलिखित कार्य करें:

function insert(str, index, value) {
    return str.substr(0, index) + value + str.substr(index);
}

और फिर इसे इस तरह उपयोग करें:

alert(insert("foo baz", 4, "bar "));

आउटपुट: फू बार बाज

यह ठीक वैसे ही व्यवहार करता है, जैसे C # (शार्प) String.Insert (int startIndex, string value)।

नोट: इस डालने समारोह आवेषण स्ट्रिंग मूल्य (तीसरी पैरामीटर) से पहले निर्दिष्ट पूर्णांक सूचकांक स्ट्रिंग में (दूसरा पैरामीटर) str (पहले पैरामीटर), और फिर बदले बिना नई स्ट्रिंग रिटर्न str !


16

अद्यतन २०१६: यहाँ एक और है बस के लिए मज़ा (लेकिन और अधिक गंभीर!) एक लाइनर पर आधारित प्रोटोटाइप समारोह RegExpदृष्टिकोण (पर आगे जोड़ते समर्थन के साथ undefinedया नकारात्मक index):

/**
 * Insert `what` to string at position `index`.
 */
String.prototype.insert = function(what, index) {
    return index > 0
        ? this.replace(new RegExp('.{' + index + '}'), '$&' + what)
        : what + this;
};

console.log( 'foo baz'.insert('bar ', 4) );  // "foo bar baz"
console.log( 'foo baz'.insert('bar ')    );  // "bar foo baz"

पिछला (2012 तक) बस के लिए मज़ा समाधान:

var index = 4,
    what  = 'bar ';

'foo baz'.replace(/./g, function(v, i) {
    return i === index - 1 ? v + what : v;
});  // "foo bar baz"

1
यह भी बहुत अच्छा है अगर आपको एक स्ट्रिंग में कई सूचकांकों पर पाठ सम्मिलित करने की आवश्यकता है। नीचे मेरा जवाब देखें अगर ऐसा है तो।
बजे जेक स्टॉफ़लर

12

अगर किसी को एक स्ट्रिंग में कई सूचकांकों पर पाठ सम्मिलित करने के लिए कोई रास्ता मिल रहा है, तो इसे आज़माएं:

String.prototype.insertTextAtIndices = function(text) {
    return this.replace(/./g, function(character, index) {
        return text[index] ? text[index] + character : character;
    });
};

उदाहरण के लिए, आप <span>एक स्ट्रिंग में कुछ ऑफ़सेट पर टैग सम्मिलित करने के लिए इसका उपयोग कर सकते हैं :

var text = {
    6: "<span>",
    11: "</span>"
};

"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"

1
मैंने इस विधि को आजमाया लेकिन '6' और '11' को चरों के साथ बदलने से यह काम नहीं करता है - मैं क्या गलत कर रहा हूं - कृपया मदद करें। अग्रिम धन्यवाद :)
डेक्स डेव

1
6 और 11 सूचकांक हैं, जिस पर पाठ को स्ट्रिंग में डाला जाएगा। 6: "<span>"कहते हैं: इंडेक्स 6 में, "<span>" टेक्स्ट डालें। क्या आप कह रहे हैं कि आप पूर्णांक चर के मान को सम्मिलन सूचकांक के रूप में उपयोग करना चाहते हैं? अगर ऐसा है, तो कुछ इस तरह var a=6, text = {}; text[a] = "<span>";
आज़माएँ

1
हाँ मैं सम्मिलन के रूप में पूर्णांक चर का उपयोग करना चाहता हूं, आपकी विधि ने काम किया - धन्यवाद - यह वही है जो मैंने var a = 6 का उपयोग किया है; var b = 11; पाठ = {}; पाठ [a] = "xx"; पाठ [b] = "yy"; - क्या यह लिखने का एक बेहतर तरीका है कि
डेक्स डेव

11

यह मूल रूप से @ Bass33 कर रहा है सिवाय इसके कि मैं अंत से गणना करने के लिए एक नकारात्मक सूचकांक का उपयोग करने का विकल्प भी दे रहा हूं। की तरह विधि विधि की अनुमति देता है।

// use a negative index to insert relative to the end of the string.

String.prototype.insert = function (index, string) {
  var ind = index < 0 ? this.length + index  :  index;
  return  this.substring(0, ind) + string + this.substring(ind, this.length);
};

मामले का उपयोग करें: कहते हैं कि आपके पास एक नामकरण सम्मेलन का उपयोग करके पूर्ण आकार की छवियां हैं, लेकिन थम्बनेल url प्रदान करने के लिए डेटा को अपडेट नहीं कर सकते।

var url = '/images/myimage.jpg';
var thumb = url.insert(-4, '_thm');

//    result:  '/images/myimage_thm.jpg'

9

अपने वर्तमान उदाहरण को देखते हुए आप या तो परिणाम प्राप्त कर सकते हैं

var txt2 = txt1.split(' ').join(' bar ')

या

var txt2 = txt1.replace(' ', ' bar ');

लेकिन यह देखते हुए कि आप ऐसी धारणाएँ बना सकते हैं, आप सीधे गुलेन के उदाहरण को छोड़ सकते हैं।

ऐसी स्थिति में जहां आप वास्तव में चरित्र सूचकांक आधारित के अलावा कोई धारणा नहीं बना सकते हैं, तो मैं वास्तव में एक विकल्प समाधान के लिए जाऊंगा।



6

मुझे पता है कि यह एक पुराना धागा है, हालांकि, यहां वास्तव में एक प्रभावी तरीका है।

var tn = document.createTextNode("I am just  to help")
t.insertData(10, "trying");

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

क्या आपको एक स्ट्रिंग की आवश्यकता है, बस नोड की पाठ सामग्री संपत्ति तक पहुंचें।

tn.textContent
#=> "I am just trying to help"

6

खैर, हम सबस्ट्रिंग और स्लाइस विधि दोनों का उपयोग कर सकते हैं।

String.prototype.customSplice = function (index, absIndex, string) {
    return this.slice(0, index) + string+ this.slice(index + Math.abs(absIndex));
};


String.prototype.replaceString = function (index, string) {
    if (index > 0)
        return this.substring(0, index) + string + this.substring(index, this.length);

    return string + this;
};


console.log('Hello Developers'.customSplice(6,0,'Stack ')) // Hello Stack Developers
console.log('Hello Developers'.replaceString(6,'Stack ')) //// Hello Stack Developers

एक विकल्प विधि की एकमात्र समस्या यह है कि यह एक नकारात्मक सूचकांक के साथ काम नहीं करेगा। यह हमेशा 0 वें स्थान से स्ट्रिंग इंडेक्स लेता है।


अनुपस्थिति के लिए क्या है?
एनरिक बरमूज

Btw, दूसरी विधि के लिए धन्यवाद। यह एक सम्मोहन की तरह काम करता है!
एनरिक बरमूडेज़

5
function insertString(string, insertion, place) {
  return string.replace(string[place] + string[place + 1], string[place] + insertion + string[place + 1])
}

तो, आपके लिए, यह होगा insertString("foo baz", "bar", 3);

जाहिर है, यह उपयोग करने के लिए एक पेंट होगा क्योंकि आपको हर बार फ़ंक्शन को अपनी स्ट्रिंग की आपूर्ति करनी होगी, लेकिन फिलहाल मुझे नहीं पता कि इसे कैसे बनाना आसान है string.replace(insertion, place)। विचार अभी भी खड़ा है, हालांकि।


4

आप एक गतिशील पैटर्न के साथ रेगुलर एक्सप्रेशंस का उपयोग कर सकते हैं ।

var text = "something";
var output = "                    ";
var pattern = new RegExp("^\\s{"+text.length+"}");
var output.replace(pattern,text);

आउटपुट:

"something      "

यह text.lengthस्ट्रिंग की शुरुआत में व्हाट्सएप पात्रों की जगह लेता है outputRegExpसाधन ^\- एक लाइन की शुरुआत \sकिसी भी सफेद स्थान चरित्र, बार-बार {n}बार, इस मामले में text.length। तार के बाहर इस तरह के पैटर्न का निर्माण करते समय बैकस्लैश \\से \बचने के लिए उपयोग करें ।


3

एक और समाधान, स्ट्रिंग को 2 में काटें और बीच में एक स्ट्रिंग डालें।

var str = jQuery('#selector').text();

var strlength = str.length;

strf = str.substr(0 , strlength - 5);
strb = str.substr(strlength - 5 , 5);

jQuery('#selector').html(strf + 'inserted' + strb);

3

आप इसे कोड की एक पंक्ति में regexp के साथ आसानी से कर सकते हैं

const str = 'Hello RegExp!';
const index = 6;
const insert = 'Lovely ';
    
//'Hello RegExp!'.replace(/^(.{6})(.)/, `$1Lovely $2`);
const res = str.replace(new RegExp(`^(.{${index}})(.)`), `$1${insert}$2`);
    
console.log(res);

"नमस्ते लवली रेगुलेट!"


2

स्लाइस का उपयोग करना

आप उपयोग कर सकते हैं slice(0,index) + str + slice(index)। या आप इसके लिए एक विधि बना सकते हैं।

String.prototype.insertAt = function(index,str){
  return this.slice(0,index) + str + this.slice(index)
}
console.log("foo bar".insertAt(4,'baz ')) //foo baz bar

स्ट्रिंग्स के लिए ब्याह विधि

आप split()मुख्य तार जोड़ सकते हैं और फिर सामान्य का उपयोग कर सकते हैंsplice()

String.prototype.splice = function(index,del,...newStrs){
  let str = this.split('');
  str.splice(index,del,newStrs.join('') || '');
  return str.join('');
}


 var txt1 = "foo baz"

//inserting single string.
console.log(txt1.splice(4,0,"bar ")); //foo bar baz


//inserting multiple strings
console.log(txt1.splice(4,0,"bar ","bar2 ")); //foo bar bar2 baz


//removing letters
console.log(txt1.splice(1,2)) //f baz


//remving and inseting atm
console.log(txt1.splice(1,2," bar")) //f bar baz

कई सूचकांक में बंटवारे () को लागू करना

विधि सरणी का एक सरणी लेता है सरणी के प्रत्येक तत्व एकल का प्रतिनिधित्व करता है splice()

String.prototype.splice = function(index,del,...newStrs){
  let str = this.split('');
  str.splice(index,del,newStrs.join('') || '');
  return str.join('');
}


String.prototype.mulSplice = function(arr){
  str = this
  let dif = 0;
  
  arr.forEach(x => {
    x[2] === x[2] || [];
    x[1] === x[1] || 0;
    str = str.splice(x[0] + dif,x[1],...x[2]);
    dif += x[2].join('').length - x[1];
  })
  return str;
}

let txt = "foo bar baz"

//Replacing the 'foo' and 'bar' with 'something1' ,'another'
console.log(txt.splice(0,3,'something'))
console.log(txt.mulSplice(
[
[0,3,["something1"]],
[4,3,["another"]]
]

))


1

मैं प्रतिस्थापन और बेस 3333 और user113716 से स्लाइस का उपयोग करके विधि की तुलना करना चाहता था, यह करने के लिए कि मैंने अपना कोड लिखा था

इस पर भी एक नजर प्रदर्शन की तुलना, सबस्ट्रिंग, स्लाइस

मैंने जिस कोड का उपयोग किया है वह बहुत बड़ा तार बनाता है और स्ट्रिंग "बार" को कई बार विशाल स्ट्रिंग में सम्मिलित करता है

if (!String.prototype.splice) {
    /**
     * {JSDoc}
     *
     * The splice() method changes the content of a string by removing a range of
     * characters and/or adding new characters.
     *
     * @this {String}
     * @param {number} start Index at which to start changing the string.
     * @param {number} delCount An integer indicating the number of old chars to remove.
     * @param {string} newSubStr The String that is spliced in.
     * @return {string} A new string with the spliced substring.
     */
    String.prototype.splice = function (start, delCount, newSubStr) {
        return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
    };
}

String.prototype.splice = function (idx, rem, str) {
    return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};


String.prototype.insert = function (index, string) {
    if (index > 0)
        return this.substring(0, index) + string + this.substring(index, this.length);

    return string + this;
};


function createString(size) {
    var s = ""
    for (var i = 0; i < size; i++) {
        s += "Some String "
    }
    return s
}


function testSubStringPerformance(str, times) {
    for (var i = 0; i < times; i++)
        str.insert(4, "bar ")
}

function testSpliceStringPerformance(str, times) {
    for (var i = 0; i < times; i++)
        str.splice(4, 0, "bar ")
}


function doTests(repeatMax, sSizeMax) {
    n = 1000
    sSize = 1000
    for (var i = 1; i <= repeatMax; i++) {
        var repeatTimes = n * (10 * i)
        for (var j = 1; j <= sSizeMax; j++) {
            var actualStringSize = sSize *  (10 * j)
            var s1 = createString(actualStringSize)
            var s2 = createString(actualStringSize)
            var start = performance.now()
            testSubStringPerformance(s1, repeatTimes)
            var end = performance.now()
            var subStrPerf = end - start

            start = performance.now()
            testSpliceStringPerformance(s2, repeatTimes)
            end = performance.now()
            var splicePerf = end - start

            console.log(
                "string size           =", "Some String ".length * actualStringSize, "\n",
                "repeat count          = ", repeatTimes, "\n",
                "splice performance    = ", splicePerf, "\n",
                "substring performance = ", subStrPerf, "\n",
                "difference = ", splicePerf - subStrPerf  // + = splice is faster, - = subStr is faster
                )

        }
    }
}

doTests(1, 100)

प्रदर्शन में सामान्य अंतर सबसे अच्छा है और दोनों ही तरीके ठीक काम करते हैं (लंबाई के स्ट्रिंग्स पर भी ~~ 12000000)


0
  1. स्ट्रिंग से एक सरणी तुरंत
  2. ऐरे # ब्याह का उपयोग करें
  3. Array # join करके फिर से स्ट्रिंग करें

इस दृष्टिकोण के लाभ दो गुना हैं:

  1. सरल
  2. यूनिकोड कोड पॉइंट कंप्लेंट

const pair = Array.from('USDGBP')
pair.splice(3, 0, '/')
console.log(pair.join(''))

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