Insert a string at a specific index

前端 未结 18 708
眼角桃花
眼角桃花 2020-11-22 14:02

How can I insert a string at a specific index of another string?

 var txt1 = \"foo baz\"

Suppose I want to insert \"bar \" after the \"foo

相关标签:
18条回答
  • my_string          = "hello world";
    my_insert          = " dear";
    my_insert_location = 5;
    
    my_string = my_string.split('');  
    my_string.splice( my_insert_location , 0, my_insert );
    my_string = my_string.join('');
    

    https://jsfiddle.net/gaby_de_wilde/wz69nw9k/

    0 讨论(0)
  • 2020-11-22 14:22

    Take the solution. I have written this code in an easy format:

    const insertWord = (sentence,word,index) => {
        var sliceWord = word.slice(""),output = [],join; // Slicing the input word and declaring other variables
        var sliceSentence = sentence.slice(""); // Slicing the input sentence into each alphabets
        for (var i = 0; i < sliceSentence.length; i++) 
               {
            if (i === index) 
                   { // checking if index of array === input index
                for (var j = 0; j < word.length; j++) 
                           {   // if yes we'll insert the word
                    output.push(sliceWord[j]); // Condition is true we are inserting the word
                           }
                output.push(" "); // providing a single space at the end of the word
                     }
            output.push(sliceSentence[i]);  // pushing the remaining elements present in an array
                }
        join = output.join(""); // converting an array to string
        console.log(join)
        return join;
    }
    
    0 讨论(0)
  • 2020-11-22 14:24

    UPDATE 2016: Here is another just-for-fun (but more serious!) prototype function based on one-liner RegExp approach (with prepend support on undefined or negative 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"
    

    Previous (back to 2012) just-for-fun solution:

    var index = 4,
        what  = 'bar ';
    
    'foo baz'.replace(/./g, function(v, i) {
        return i === index - 1 ? v + what : v;
    });  // "foo bar baz"
    
    0 讨论(0)
  • 2020-11-22 14:24

    If anyone is looking for a way to insert text at multiple indices in a string, try this out:

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

    For example, you can use this to insert <span> tags at certain offsets in a string:

    var text = {
        6: "<span>",
        11: "</span>"
    };
    
    "Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
    
    0 讨论(0)
  • 2020-11-22 14:25

    I wanted to compare the method using substring and the method using slice from Base33 and user113716 respectively, to do that I wrote some code

    also have a look at this performance comparison, substring, slice

    The code I used creates huge strings and inserts the string "bar " multiple times into the huge string

    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)

    The general difference in performance is marginal at best and both methods work just fine (even on strings of length ~~ 12000000)

    0 讨论(0)
  • 2020-11-22 14:26

    Given your current example you could achieve the result by either

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

    or

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

    but given that you can make such assumptions, you might as well skip directly to Gullen's example.

    In a situation where you really can't make any assumptions other than character index-based, then I really would go for a substring solution.

    0 讨论(0)
提交回复
热议问题