جاوااسکریپت - درج یک رشته در ایندکس مشخص


چگونه میتوانم یک رشته را در یک شاخص خاص از رشتهای دیگر وارد کنم؟

 var txt1 = "foo baz"

فرض کنید میخواهم «bar » را بعد از «foo» وارد کنم، چگونه میتوانم به آن دست یابم؟

من به substring() فکر کردم، اما حتما باید یک راه سادهتر و مستقیمتر وجود داشته باشد.

پاسخ شماره ۱

قرار دادن در یک اندیس مشخص (به جای، مثلاً، در اولین کاراکتر فاصله) باید از برش رشته/زیررشته استفاده کند:

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

پاسخ شماره ۲

میتوانید خودتان یک نمونهٔ اولیه از splice() را در رشته بسازید.

پلیفیل

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 یک مقدار مطلق است.

پاسخ شماره ۳

در اینجا روشی را نوشتم که مانند تمام زبانهای برنامهنویسی دیگر عمل میکند:

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)

منبع:

  • http://coderamblings.wordpress.com/2012/07/09/insert-a-string-at-a-specific-index/

پاسخ شماره ۴

فقط تابع زیر را بسازید:

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

و سپس از آن به این شکل استفاده کنید:

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

خروجی: foo bar baz

این دقیقاً مانند متد C# (شارپ) String.Insert(int startIndex, string value) رفتار میکند.

توجه: این تابع insert رشته value (پارامتر سوم) را قبل از عدد صحیح مشخص شده index (پارامتر دوم) در رشته str (پارامتر اول) وارد میکند و سپس رشته جدید را بدون تغییر str بازمیگرداند!

پاسخ شماره ۵

  1. ایجاد یک آرایه از رشته
  2. استفاده از Array#splice
  3. دوباره با استفاده از Array#join رشتهای کن

مزایای این رویکرد دوگانه است:

  1. ساده
  2. مطابق با نقطه کد یونیکد

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

پاسخ شماره ۶

این اساساً همان کاری است که @Base33 انجام میدهد، به جز اینکه من همچنین گزینه استفاده از شاخص منفی برای شمارش از پایان را ارائه میکنم. شبیه به روشی که متد substr اجازه میدهد.

// 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.substr(ind);
};

مثال: فرض کنید تصاویری در اندازه کامل دارید که از یک قرارداد نامگذاری استفاده میcکنند، اما نمیcتوانید دادهcها را بهcروزرسانی کنید تا نشانیcهای اینترنتی تصاویر کوچک نیز ارائه کنید.

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

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

پاسخ شماره ۷

بهروزرسانی ۲۰۱۶: در اینجا یک تابع نمونهٔ دیگر فقط برای تفریح (اما جدیتر!) بر اساس روش یک خطی 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"

پاسخ شماره ۸

اگر کسی به دنبال راهی برای وارد کردن متن در چندین شاخص در یک رشته است، این را امتحان کنید:

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>!"

پاسخ شماره ۹

با توجه به مثال فعلی شما میتوانید نتیجه را با هر یک از روشهای زیر به دست آورید

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

یا

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

اما از آنجا که میتوانید چنین فرضیاتی را مطرح کنید، میتوانید مستقیماً به مثال گولن بروید.

در شرایطی که واقعاً نمیتوانید هیچ فرضی جز مبنی بر شاخص کاراکتر داشته باشید، در این صورت من واقعاً به سراغ راهحل زیررشتهای میروم.