একটি নির্দিষ্ট সূচীতে একটি স্ট্রিং .োকান


333

আমি অন্য স্ট্রিংয়ের একটি নির্দিষ্ট সূচীতে একটি স্ট্রিং কীভাবে ?োকাতে পারি?

 var txt1 = "foo baz"

ধরুন আমি "ফু" এর পরে "বার" toোকাতে চাই কীভাবে আমি এটি অর্জন করতে পারি?

আমি ভেবেছিলাম 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
আমি জানি এটি ২০১০ সালের, তবে নীচের sliceসমাধানটি আরও ভাল এবং সহজ। (স্প্লাইস ধ্বংসাত্মক, স্লাইস নয় এবং "আপনি জানেন না এমন অবজেক্টগুলিকে সংশোধন করা এড়ানো ভাল))। এই সমাধানটি একেবারে প্রথম দৃশ্যমান উত্তর হওয়া উচিত নয়, যদিও এটি সেই সময়টি বোধগম্য হয়েছিল।
এরিক বার্কল্যান্ড 8

6
@ এরিকবির্কল্যান্ড: স্ট্রিংগুলি অপরিবর্তনীয়। উপরের কোডটি কোনও বস্তুকে সংশোধন করে না। যেভাবেই হোক না কেন, "অবজেক্টসগুলি আপনি জানেন না" তা সংশোধন না করার ধারণাটি অ্যারে মিউটেশন পদ্ধতিগুলিকে বাদ দেয়। আপনি বলছেন আপনি বরং my_array[my_array.length] = itemপরিবর্তে করতে চান my_array.push(item)?

4
দুঃখিত, আমি বোঝাতে চাইছি "আপনি নিজেরাই করেন না"। আপনি spliceএই ক্ষেত্রে ঠিক সম্পর্কে ; প্রকৃতপক্ষে স্ট্রিং অপরিবর্তনীয়। এই কারণে আমি মনে করি spliceযদিও এটি একটি দুর্বল কী শব্দ পছন্দ। আমার মূল আপত্তিটি প্রোটোটাইপগুলি নির্বিচারে প্রসারিত করার বিরুদ্ধে, যদি না তারা মানক পলফিল হয়।
এরিক বার্কল্যান্ড

1
এটা অবিশ্বাস্যভাবে একটি বিল্ট-ইন অবজেক্টের পরিবর্তন করতে খারাপ অনুশীলন। আমরা স্মুশগেটের সাথে দেখেছি যে ভাষাতে নতুন কার্যকারিতা যুক্ত হওয়ার সাথে সাথে আপনার কোডটি ভেঙে ফেলার ঝুঁকি রয়েছে এবং, যদি আপনার দায়িত্বজ্ঞানহীন পরিবর্তনটি কোনওভাবে একটি লাইব্রেরিতে প্রবেশ করে যা ওয়েব জুড়ে উল্লেখযোগ্য উত্সাহ দেখায়, এটি একটি সাধারণ, স্পষ্ট পদ্ধতির নাম ব্যবহারকে অবরুদ্ধ করতে পারে নতুন কার্যকারিতা জন্য।
শান

401

নির্দিষ্ট সূচীতে সন্নিবেশ করানো (বরং প্রথম স্থানের অক্ষর থেকে বলার অপেক্ষা রাখে) স্ট্রিং স্লাইসিং / সাবস্ট্রিং ব্যবহার করতে হবে:

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

4
@ আলেজান্দ্রোসালামঞ্চ মজুয়েলো: substringএখানে ঠিক আছে। আমি sliceসাধারণভাবে পছন্দ করি কারণ এটি আরও নমনীয় (নেতিবাচক সূচকগুলি, যেমন "foo baz".slice(1, -2))। এটি সামান্য খাটোও, খুব কম দামের জন্য।
টিম ডাউন

8
ES6 আরও ভাল বিকল্প প্রস্তাব? কমপক্ষে স্ট্রিং ইন্টারপোলেশন ব্যবহার করতে পারে, যেমন`${txt1.slice(0,3)}bar${txt1.slice(3)}`
জয়

1
এটি উপরে বর্ণিতdelete বৈশিষ্ট্যটি ব্যবহার করে না ; শীর্ষ উত্তর ...
মিঃ পলিহর্ল

11
@ মিঃপল্লিহওয়ার: না। প্রশ্নটি করার দরকারের কোনও উল্লেখ নেই।
টিম ডাউন

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

আউটপুট: ফু বার বাজ

এটি সি # (শার্প) স্ট্রিংয়ের মতো হুবহু আচরণ করে n

উল্লেখ্য: এই সন্নিবেশ ফাংশন টিপে স্ট্রিং মান (তৃতীয় প্যারামিটার) সামনে নিদিষ্ট পূর্ণসংখ্যা সূচক স্ট্রিং (দ্বিতীয় প্যারামিটার) Str (প্রথম প্যারামিটার), এবং তারপর পরিবর্তন না করে নতুন স্ট্রিং ফেরৎ Str !


16

আপডেট ২০১ 2016: এখানে ওয়ান-লাইনারের পদ্ধতির উপর ভিত্তি করে মজাদার (তবে আরও গুরুতর!) প্রোটোটাইপ ফাংশন রয়েছে 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"

পূর্ববর্তী (২০১২ -এ ফিরে) কেবল-মজাদার সমাধান:

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>";
জেক স্টোফলার 12'15

1
হ্যাঁ আমি সন্নিবেশ হিসাবে পূর্ণসংখ্যার ভেরিয়েবলগুলি ব্যবহার করতে চাই, আপনার পদ্ধতিটি কাজ করেছিল - আপনাকে ধন্যবাদ - আমি এটিই var a = 6 ব্যবহার করেছি; var b = 11; পাঠ্য = {}; পাঠ্য [a] = "xx"; পাঠ্য [খ] = "yy"; - যদিও এটি লেখার আরও ভাল উপায় আছে
ডেক্স ডেভ

11

এটি মূলত যা করছে @ বাস 33 এগুলি করছে তা বাদ দিয়ে আমি শেষ থেকে গণনা করার জন্য একটি নেতিবাচক সূচক ব্যবহার করার বিকল্পটি দিচ্ছি। সাবস্ট্রিট পদ্ধতিটি পছন্দ করে।

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

কেস ব্যবহার করুন: বলুন যে নামকরণের কনভেনশন ব্যবহার করে আপনার কাছে পূর্ণ আকারের চিত্র রয়েছে তবে থাম্বনেইল ইউআরএল সরবরাহ করতে ডেটা আপডেট করতে পারবেন না।

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

আমি জানি এটি একটি পুরানো থ্রেড, তবে, এখানে একটি সত্যিকারের কার্যকর পদ্ধতি is

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

এটির মধ্যে দুর্দান্ত যা হ'ল এটি নোড সামগ্রীকে জোর করে। সুতরাং যদি এই নোডটি ইতিমধ্যে ডোমটিতে থাকে, আপনার কোনও কোয়েরি নির্বাচক ব্যবহার করতে বা অভ্যন্তরীণ পাঠ্য আপডেট করার দরকার পড়েনি। পরিবর্তনগুলি এর বাঁধাইয়ের কারণে প্রতিফলিত হবে।

আপনার যদি স্ট্রিং দরকার হয়, কেবল নোডের পাঠ্য সামগ্রীর সম্পত্তি অ্যাক্সেস করুন।

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 তম অবস্থান থেকে স্ট্রিং সূচক গ্রহণ করে।


অ্যাবিআইএনডেক্স কীসের জন্য স্ট্যান করে?
এনরিক বার্মাডেজ

বিটিডব্লিউ, দ্বিতীয় পদ্ধতির জন্য ধন্যবাদ। এটি যাদুমন্ত্রের মত কাজ করে!
এনরিক বার্মাডেজ

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

আমি স্ট্রিং ব্যবহার করে পদ্ধতিটি এবং বেস 33 এবং ব্যবহারকারী 113716 থেকে স্লাইস ব্যবহার করে যথাক্রমে তুলনা করতে চেয়েছিলাম, যাতে আমি কিছু কোড লিখেছিলাম

এছাড়াও এই পারফরম্যান্স তুলনা, সাবস্ট্রিং, টুকরা তাকান

আমার ব্যবহৃত কোডটি বিশাল স্ট্রিং তৈরি করে এবং স্ট্রিংটিকে "বার" একাধিকবার বিশাল স্ট্রিংয়ে সন্নিবেশ করায়

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. অ্যারে # জয়েন ব্যবহার করে আবার স্ট্রিংফাইটি করুন

এই পদ্ধতির সুবিধাগুলি দ্বিগুণ:

  1. সহজ
  2. ইউনিকোড কোড পয়েন্ট অনুসারে

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

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