ऐसा लगता है कि बहुत सारे भ्रम हैं जो केवल एल्क्लानेर और रेनॉ77 द्वारा टिप्पणियों में संबोधित किए गए थे, इसलिए मुझे एक स्पष्ट जवाब देना चाहिए।
स्पष्टीकरण
" string.splice" से कोई यह उम्मीद कर सकता है कि यह सरणियों के लिए पसंद है:
- 3 तर्क तक स्वीकार करते हैं: स्थिति, लंबाई और (वैकल्पिक रूप से) सम्मिलन (स्ट्रिंग) शुरू करें
- कट आउट भाग लौटाता है
- मूल स्ट्रिंग को संशोधित करता है
समस्या यह है, 3 डी आवश्यकता को पूरा नहीं किया जा सकता है क्योंकि तार अपरिवर्तनीय हैं (संबंधित: 1 , 2 ), मैंने यहां सबसे समर्पित टिप्पणी पाई है :
जावास्क्रिप्ट में तार आदिम मूल्य प्रकार हैं और न कि ऑब्जेक्ट ( युक्ति )। वास्तव में, ES5 के रूप में, वे केवल 5 मान प्रकारों में nullसे एक हैं undefined, numberऔर boolean। स्ट्रिंग्स को मूल्य द्वारा निर्दिष्ट किया जाता है और संदर्भ द्वारा नहीं और इस तरह से पारित किया जाता है। इस प्रकार, तार सिर्फ अपरिवर्तनीय नहीं हैं, वे एक मूल्य हैं । स्ट्रिंग "hello"को बदलना यह "world"निर्णय लेने जैसा है कि अब से 3 नंबर 4 है ... इसका कोई मतलब नहीं है।
तो, उस खाते के साथ, string.spliceकेवल " " बात की उम्मीद कर सकते हैं :
- 2 तर्कों को स्वीकार करता है: स्थिति शुरू, लंबाई (प्रविष्टि कोई मतलब नहीं है क्योंकि स्ट्रिंग नहीं बदली गई है)
- कट आउट भाग लौटाता है
जो substrकरता है; या, वैकल्पिक रूप से,
- 3 तर्क तक स्वीकार करते हैं: स्थिति, लंबाई और (वैकल्पिक रूप से) सम्मिलन (स्ट्रिंग) शुरू करें
- संशोधित स्ट्रिंग लौटाता है (कट भाग के बिना और सम्मिलन के साथ)
जो अगले भाग का विषय है।
समाधान
यदि आप अनुकूलन के बारे में परवाह करते हैं, तो आपको संभवतः माइक के कार्यान्वयन का उपयोग करना चाहिए:
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 अक्षरों के स्ट्रिंग्स के लिए यह O50 / में x50 है यह सुरक्षित है:
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
ध्यान दें कि मैंने १० अक्षरों से १०० अक्षरों की ओर बढ़ने पर पहली और २ डी बहस बदली है (फिर भी मुझे आश्चर्य है कि १०० अक्षरों की परीक्षा १० अक्षरों की तुलना में तेजी से चलती है)।
str.splitवह कार्य हो सकता है जिसे आप देख रहे हैं: google.com/#q=javascript+string+split