স্ট্রিংগুলির জন্য কোনও বিভাজন পদ্ধতি আছে?


92

জাভাস্ক্রিপ্ট spliceকেবল অ্যারে নিয়ে কাজ করে। স্ট্রিং জন্য একই পদ্ধতি আছে? অথবা আমার নিজের কাস্টম ফাংশনটি তৈরি করা উচিত?

substr()এবং substring()পদ্ধতি শুধুমাত্র নিষ্কাশিত স্ট্রিং ফিরে আসবে এবং মূল স্ট্রিং পরিবর্তন করবেন। আমি যা করতে চাই তা হ'ল আমার স্ট্রিং থেকে কিছু অংশ সরিয়ে এবং পরিবর্তনটি মূল স্ট্রিংয়ে প্রয়োগ করা। তদুপরি, পদ্ধতিটি replace()আমার ক্ষেত্রে কার্যকর হবে না কারণ আমি কোনও সূচক থেকে শুরু করে অংশটি অন্য কোনও সূচীতে শেষ করতে চাই, ঠিক যেমন splice()পদ্ধতিটির সাথে আমি কী করতে পারি like আমি আমার স্ট্রিংটিকে একটি অ্যারেতে রূপান্তরিত করার চেষ্টা করেছি, তবে এটি একটি ঝরঝরে পদ্ধতি নয়।


str.splitআপনি যে ফাংশনটি সন্ধান করছেন তা হতে পারে: google.com/#q=javascript+string+split
অ্যান্ডারসন গ্রিন

4
এর সাথে কী হয়েছে str = str.slice()?
elclanrs

4
একটি এক্সওয়াই সমস্যা মনে হচ্ছে, আপনি ঠিক কী করতে চেষ্টা করছেন? স্ট্রিংগুলি অ্যারে এবং অবজেক্টগুলির বিপরীতে রেফারেন্স দ্বারা পাস করা হয় না, সুতরাং আপনি স্ট্রিংগুলিকে পরিবর্তন করতে পারবেন না, আপনি নতুন তৈরি করেন বা পুরানোটির সাথে নতুনটিকে পুনরায় বরাদ্দ করেন।
elclanrs


6
return string.slice(0, startToSplice) + string.slice(endToSplice);, না?
রায়না 77 ই

উত্তর:


90

এর মতো দু'বার স্ট্রিং টুকরো করা দ্রুত:

function spliceSlice(str, index, count, add) {
  // We cannot pass negative indexes directly to the 2nd slicing operation.
  if (index < 0) {
    index = str.length + index;
    if (index < 0) {
      index = 0;
    }
  }

  return str.slice(0, index) + (add || "") + str.slice(index + count);
}

একটি যোগদান (কুমার হর্ষের পদ্ধতি) এর পরে বিভাজন ব্যবহার করার চেয়ে এই জাতীয় শব্দগুলি:

function spliceSplit(str, index, count, add) {
  var ar = str.split('');
  ar.splice(index, count, add);
  return ar.join('');
}

এখানে এমন একটি জাসস্পিফ রয়েছে যা দুটি এবং দু'একটি অন্যান্য পদ্ধতির তুলনা করে। (jsperf এখন কয়েক মাসের জন্য নিচে ছিল। মন্তব্যে বিকল্প প্রস্তাব করুন।)

যদিও উপরের কোডটি সাধারণ কার্যকারিতা পুনরুত্পাদনকারী ফাংশনগুলি প্রয়োগ করে splice, প্রশ্নকারী দ্বারা উপস্থাপিত কেসটির জন্য কোডটি অনুকূলিত করে (যা পরিবর্তিত স্ট্রিংয়ে কিছুই যুক্ত করা যায় না) বিভিন্ন পদ্ধতির আপেক্ষিক কার্যকারিতা পরিবর্তন করে না।


4
আপনি এটি দিয়ে বিশ্বব্যাপী এটি যুক্ত করতে পারেন: String.prototype.splice = function (index, count, add) { return this.slice(0, index) + (add || "") + this.slice(index + count); } কেবল মনে রাখবেন এটি অ্যারে স্প্লাইস পদ্ধতির মতো একইভাবে কাজ করে না কারণ স্ট্রিংগুলি অপরিবর্তনীয় (আপনি একবার এগুলি তৈরি করার পরে তাদের পরিবর্তন করতে পারবেন না)। সুতরাং ব্যবহারের মতো হবে:var s="ss"; s = s.splice(0,1,"t");
উইলিয়াম নীলি

@ উইলিয়ামনিইলি: var StringUtils={'StringSplice':/*func def*/};স্ট্রিং ম্যানিপুলেশনের জন্য আদর্শ হবে কারণ আপনি বলেছেন যে এটি পরিবর্তনযোগ্য নয়।
মিঃ পলিহর্িল

অ্যারে.প্রোটোটাইপ.স্প্লাইস নেতিবাচক সূচকগুলি গ্রহণের কারণে স্প্লাইস্লাইস এবং স্প্লাইসস্প্লিট কার্যত সমান নয়: jsfiddle.net/sykteho6/5
মার্টিজন

4
@ মিজিয়ালাকে ধন্যবাদ, আমি এটির যত্ন নেওয়ার জন্য কোড যুক্ত করেছি।
লুই

টেম্পোর ওয়ার্স তৈরি করা এবং একের পর এক ত্রুটির জন্য জায়গা প্রবর্তন করা, বিভাজন ("") এর বিপরীতে মানুষের প্রক্রিয়া করতে বেশি সময় লাগে এমন কোডের কথা উল্লেখ না করা। স্প্লাইস (...) যোগ দিন ("") একটি ট্রেড অফ বিবেচনা প্রাপ্য। গতি ইস্যুটি যদি কোনও সমস্যা হয় তবে তা কেবল একটি সমস্যা।
ব্যালেফ

16

সম্পাদনা করুন

এটি অবশ্যই স্ট্রিংয়ের "স্প্লাইস" করার সর্বোত্তম উপায় নয়, বাস্তবায়নটি কীভাবে হবে তার উদাহরণ হিসাবে আমি এটি দিয়েছিলাম, যা ত্রুটিপূর্ণ এবং বিভাজন (), স্প্লাইস () এবং যোগদান () থেকে খুব স্পষ্ট। আরও ভাল বাস্তবায়নের জন্য, লুইয়ের পদ্ধতিটি দেখুন।


না, তেমন কোনও জিনিস নেই String.spliceতবে আপনি এটি ব্যবহার করে দেখতে পারেন:

newStr = str.split(''); // or newStr = [...str];
newStr.splice(2,5);
newStr = newStr.join('');

আমি বুঝতে পারি spliceঅ্যারেগুলির মতো কোনও ফাংশন নেই , সুতরাং আপনাকে স্ট্রিংটিকে অ্যারেতে রূপান্তর করতে হবে। দুর্ভাগ্য...


আমার ক্ষেত্রে আমি ডায়নামিক স্ট্রিংয়ে কাজ করছি যাতে আমাকে সূচকগুলি উল্লেখ করতে হবে এবং চরিত্রের মানটি নয়।
প্রলিজি

হ্যাঁ, এটি দুর্ভাগ্যজনকভাবে সঠিক। তবে আপনি স্ট্রিং.প্রোটোটাইপ.ইনডেক্স হিসাবে ব্যবহার করে কোনও চরিত্রের সূচক পেতে পারেন"asdsd".indexOf('s');
কুমারহর্ষিশ

4
স্ট্রিংস্প্লিট ব্যবহার না করে আপনি ES6 স্প্রেড সিনট্যাক্সটি এর মতো ব্যবহার করতে পারেন:[...str]
রবি 14

5

এখানে একটি দুর্দান্ত ছোট কারি যা আরও ভাল পাঠযোগ্যতার (আইএমএইচও) ধার দেয়:

দ্বিতীয় ফাংশনের স্বাক্ষর Array.prototype.spliceপদ্ধতিটির মতো ident

function mutate(s) {
    return function splice() {
        var a = s.split('');
        Array.prototype.splice.apply(a, arguments);
        return a.join('');
    };
}

mutate('101')(1, 1, '1');

আমি জানি ইতিমধ্যে একটি গ্রহণযোগ্য উত্তর আছে, তবে আশা করি এটি কার্যকর is


4
এনপি। এমনকি আপনি এটি একটি বিচ্ছিন্ন 'method'প্যারামিটারকে বলতে অনুমতি দিতে, বলতে পারেন, যাতে আপনি একটি পাস করতে পারেন Array.prototype[method]এবং অ্যারের মতো স্ট্রিংগুলি পুরোপুরি চিকিত্সা করতে পারেন । এছাড়াও, একা এই এক সঙ্গে, আপনি করতে পারে বিমূর্ত অন্য ফাংশন প্রকৃত প্রক্রিয়া - এবং কোন স্ট্রিং যদি একটি ফাংশন যে স্ট্রিং গ্রহণ করা এবং কারি উল্টে যায় ফিরে mutate()(1, 1, '1')('101'); আপনি খালি প্রার্থনার তরকারি থেকে মুক্তি দিতে যুক্তিগুলিকে হাঁস টাইপ করতে পারেন - এমনকি কোনও পদ্ধতি নিজেই সজ্জিত করে। আপনার যদি এই জিনিসগুলির প্রয়োজন হয় তবে আপনি কমান্ড প্যাটার্নটি সন্ধান করতে পারেন । এখানে শুধু থুতু-বলিং
কোডি

3

আমি কুমার / কোডি এবং লুই উভয় পদ্ধতিতে একটি সহজ বিকল্প দিতে চাই। আমি যে সমস্ত পরীক্ষাগুলি চালিয়েছি, এটি লুই পদ্ধতি হিসাবে তত দ্রুত সঞ্চালন করে (বেঞ্চমার্কের জন্য ফ্রেড পরীক্ষা দেখুন)

String.prototype.splice = function(startIndex,length,insertString){
    return this.substring(0,startIndex) + insertString + this.substring(startIndex + length);
};

আপনি এটি এর মতো ব্যবহার করতে পারেন:

var creditCardNumber = "5500000000000004";
var cardSuffix = creditCardNumber.splice(0,12,'****');
console.log(cardSuffix);  // output: ****0004

পরীক্ষার ফলাফল দেখুন: https://jsfiddle.net/0quz9q9m/5/


আপনার , otherwise the third argument is not optional. This implementation also doesn't take care of অন্যান্য পরামর্শগুলির চেয়ে কমপক্ষে in + insertString + startIndex <0` এর পরিবর্তে `+ (insertString ||" ") + do করা উচিত । যদিও ব্যবহারের দুর্দান্ত উদাহরণ
YakovL

3

অনেকগুলি বিভ্রান্তি রয়েছে বলে মনে হচ্ছে যা কেবল এলকার এবং রায়না 77 মন্তব্য দ্বারা সম্বোধন করেছে, সুতরাং আমাকে একটি স্পষ্ট করার উত্তর পোস্ট করুন।

স্পষ্টতা

" string.splice" থেকে কেউ আশা করতে পারে যে এটির মতো এটির মতো:

  • 3 টি পর্যন্ত আর্গুমেন্ট গ্রহণ করে: অবস্থান শুরু করুন, দৈর্ঘ্য এবং (allyচ্ছিকভাবে) সন্নিবেশ (স্ট্রিং)
  • কাট আউট অংশ প্রদান
  • মূল স্ট্রিংটি পরিবর্তন করে

সমস্যাটি হ'ল 3 ডি প্রয়োজনীয়তা পূরণ করা যায় না কারণ স্ট্রিংগুলি পরিবর্তনযোগ্য (সম্পর্কিত: 1 , 2 ), আমি এখানে সবচেয়ে উত্সর্গীকৃত মন্তব্য পেয়েছি :

জাভাস্ক্রিপ্টে স্ট্রিং আদিম মান ধরনের হয় এবং না বস্তু ( বৈশিষ্ট )। বস্তুত, ES5 থেকে এদের মাত্র 5 মান ধরনের এক পাশাপাশি করছি null, undefined, numberএবং boolean। Strings দ্বারা নির্ধারিত হয় মান এবং না রেফারেন্স দ্বারা এবং যেমন পাঠানো হয়। সুতরাং, স্ট্রিংগুলি কেবল অপরিবর্তনীয় নয়, তারা একটি মান । স্ট্রিং পরিবর্তন "hello"হতে "world"সিদ্ধান্ত এখন থেকে যে 3 নম্বর মত হলে সংখ্যা 4 ... এটা কোন অর্থে তোলে।

সুতরাং, এই অ্যাকাউন্টে, কেউ string.spliceকেবল " " জিনিসটি আশা করতে পারে :

  • 2 টি পর্যন্ত আর্গুমেন্ট গ্রহণ করে: অবস্থান শুরু করুন, দৈর্ঘ্য (স্ট্রিংটি পরিবর্তন না হওয়ার কারণে সন্নিবেশ কোনও অর্থ দেয় না)
  • কাট আউট অংশ প্রদান

যা কি substrকরে; বা, বিকল্পভাবে,

  • 3 টি পর্যন্ত আর্গুমেন্ট গ্রহণ করে: অবস্থান শুরু করুন, দৈর্ঘ্য এবং (allyচ্ছিকভাবে) সন্নিবেশ (স্ট্রিং)
  • পরিবর্তিত স্ট্রিং প্রদান করে (কাটা অংশ ছাড়াই এবং সন্নিবেশ সহ)

যা পরবর্তী বিভাগের বিষয়।

সমাধান

আপনি যদি অনুকূলিতকরণের বিষয়ে চিন্তা করেন তবে আপনার সম্ভবত মাইকের বাস্তবায়নটি ব্যবহার করা উচিত:

String.prototype.splice = function(index, count, add) {
    if (index < 0) {
        index += this.length;
        if (index < 0)
            index = 0;
    }
    return this.slice(0, index) + (add || "") + this.slice(index + count);
}

সীমানা ছাড়াই সূচকটির চিকিত্সা আলাদা হতে পারে, যদিও। আপনার প্রয়োজনের উপর নির্ভর করে আপনি এটি করতে পারেন:

    if (index < 0) {
        index += this.length;
        if (index < 0)
            index = 0;
    }
    if (index >= this.length) {
        index -= this.length;
        if (index >= this.length)
            index = this.length - 1;
    }

অথবা এমনকি

    index = index % this.length;
    if (index < 0)
        index = this.length + index;

আপনি যদি পারফরম্যান্সের বিষয়ে চিন্তা না করেন, তবে আপনি কুমারের পরামর্শটি গ্রহণ করতে চাইতে পারেন যা আরও সোজা-এগিয়ে রয়েছে:

String.prototype.splice = function(index, count, add) {
    var chars = this.split('');
    chars.splice(index, count, add);
    return chars.join('');
}

কর্মক্ষমতা

পারফরম্যান্সের পার্থক্যটি স্ট্রিংয়ের দৈর্ঘ্যের সাথে মারাত্মকভাবে বৃদ্ধি পায়। jsperf দেখায় যে, 10 টির দৈর্ঘ্যের স্ট্রিংগুলির জন্য দ্বিতীয় দ্রবণটির (বিভাজন এবং যোগ দেওয়া) আগের সমাধানের চেয়ে দ্বিগুণ ধীর হয় (স্লাইস ব্যবহার করে), 100-অক্ষরের স্ট্রিংয়ের জন্য এটি x5 এবং 1000-অক্ষরের স্ট্রিংগুলির জন্য এটি অপ্সে / সেকেন্ড এটি:

                      10 letters   100 letters   1000 letters
slice implementation    1.25 M       2.00 M         1.91 M
split implementation    0.63 M       0.22 M         0.04 M

নোট করুন যে আমি 10 টি বর্ণ থেকে 100 বর্ণগুলিতে স্থানান্তরিত করার সময় 1 ম এবং 2 ডি আর্গুমেন্টগুলি পরিবর্তন করেছি (এখনও আমি অবাক হয়েছি যে 100 টি বর্ণের জন্য পরীক্ষাটি 10 ​​টি বর্ণের চেয়ে দ্রুত চলে)।


2

স্ট্রিংয়ের জন্য কেবল সাবস্ট্রাস্ট ব্যবহার করুন

প্রাক্তন

var str = "Hello world!";
var res = str.substr(1, str.length);

ফলাফল = ইলো ওয়ার্ল্ড!


1

সুতরাং, কোনও স্ট্রিং প্রোটোটাইপ ক্যান্টে স্প্লাইস পদ্ধতি যুক্ত করা যাই হোক না কেন স্পেসে স্বচ্ছ কাজ করুন ...

আসুন কেউ এটি বাড়িয়ে দিন:

String.prototype.splice = function(...a){
    for(var r = '', p = 0, i = 1; i < a.length; i+=3)
        r+= this.slice(p, p=a[i-1]) + (a[i+1]||'') + this.slice(p+a[i], p=a[i+2]||this.length);
    return r;
}
  • প্রতি 3 টি আরগস গ্রুপ বিচ্ছিন্ন শৈলীতে "সন্নিবেশ" করে।
  • বিশেষ যদি সেখানে আরও একটি 3 টি আরগস গ্রুপ থাকে তবে প্রতিটি কাট বন্ধের পরেরটি শুরু হবে।
    • '0123456789'.splice (4,1,' চতুর্থ ', 8,1,' অষ্টম '); // রিটার্ন '0123furth567eighth9'
  • আপনি প্রতিটি গ্রুপে শেষ আর্গটিকে ড্রপ বা শূন্য করতে পারেন (এটি "toোকানোর জন্য কিছুই নয়" হিসাবে বিবেচিত)
    • '0123456789'.splice (-4,2); // রিটার্ন '0123459'
  • আপনি সর্বশেষ গ্রুপে 1 ম আর্গ ব্যতীত সমস্ত বাদ দিতে পারেন (যা "প্রথম আরগের পরে সমস্ত কাটা" হিসাবে বিবেচিত)
    • '0123456789'.splice (0,2, নাল, 3,1, নাল, 5,2,' / ', 8); // প্রত্যাবর্তন '24 / 7 '
  • আপনি যদি একাধিক পাস করেন তবে আপনাকে নিজের দ্বারা বাম থেকে ডান ক্রমের অবস্থানগুলি বাছাই করা উচিত!
  • এবং আপনি যদি না চান তবে এটি এটির মতো ব্যবহার করবেন না:
    • '0123456789'.splice (4, -3,' কি? '); // রিটার্ন "0123 কি? 123456789"

0

প্রোটোটাইপ ফাংশন হিসাবে লুইয়ের পদ্ধতিটি String:

String.prototype.splice = function(index, count, add) {
  if (index < 0) {
    index = this.length + index;
    if (index < 0) {
      index = 0;
    }
  }
  return this.slice(0, index) + (add || "") + this.slice(index + count);
}

উদাহরণ:

 > "Held!".splice(3,0,"lo Worl")
 < "Hello World!"

0

লুইয়ের স্প্লাইস্লাইস পদ্ধতি ব্যর্থ হয় যখন যুক্ত মান 0 বা অন্যান্য মিথ্যা মান হয়, এখানে একটি স্থিরকরণ রয়েছে:

function spliceSlice(str, index, count, add) {
  if (index < 0) {
    index = str.length + index;
    if (index < 0) {
      index = 0;
    }
  }
  const hasAdd = typeof add !== 'undefined';
  return str.slice(0, index) + (hasAdd ? add : '') + str.slice(index + count);
}

0

আমি এই কোডটি ব্যবহার করে আমার সমস্যার সমাধান করেছি, অনুপস্থিত স্প্লাইসটির কিছুটা প্রতিস্থাপন।

let str = "I need to remove a character from this";
let pos = str.indexOf("character")

if(pos>-1){
  let result = str.slice(0, pos-2) + str.slice(pos, str.length);
  console.log(result) //I need to remove character from this 
}

একটি নির্দিষ্ট শব্দের আগে / পরে আমার একটি অক্ষর অপসারণ করা দরকার, আপনি অবস্থানটি পাওয়ার পরে স্ট্রিংটি দুটি ভাগে বিভক্ত হয়ে যায় এবং তারপরে একটি অফসেট ব্যবহার করে নমনীয়ভাবে অক্ষর মুছে ফেলার মাধ্যমে পুনরায় সাজানো যায় pos

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