जावास्क्रिप्ट चॉप / स्लाइस / स्ट्रिंग में अंतिम चरित्र को छाँटो


1973

मेरे पास एक स्ट्रिंग है, 12345.00और मैं इसे वापस करना चाहूंगा 12345.0

मैंने देखा है trim, लेकिन ऐसा लगता है कि यह केवल व्हाट्सएप ट्रिमिंग है और sliceजो मुझे नहीं दिखता कि यह कैसे काम करेगा। कोई सुझाव?


36
क्या आप गोलाई की परवाह करते हैं? 12345.46 = 12345.5 या 12345.4?
RSolberg

9
क्या आप जानते हैं कि प्रत्यय क्या है या क्या आप अपने अंडरस्कोर के आधार पर अंतिम शब्द को विभाजित और हटाना चाहते हैं?
3

65
हो हो हो, @ रोलबर्ग: आप एक स्ट्रिंग राउंड नहीं कर सकते हैं !
जिग्गी

50
@Ziggy कहते हैं क्या? Math.round('0.5') === 1;)
ट्वीस्टेरोब जूल

16
@TWiStErRob ओह जावास्क्रिप्ट, मैं आपके साथ क्या करने जा रहा हूं? * सिर हिलाता है
चक ले बट

जवाबों:


3211

आप सबस्ट्रिंग फ़ंक्शन का उपयोग कर सकते हैं :

let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);

यह स्वीकृत उत्तर है, लेकिन नीचे की बातचीत के अनुसार, स्लाइस सिंटैक्स बहुत स्पष्ट है:

let str = "12345.00";
str = str.slice(0, -1); 
console.log(str);


23
@ कुहू - स्लाइस नोटेशन मेरे लिए बहुत साफ है। मैं पहले प्रतिस्थापन संस्करण का उपयोग कर रहा था। धन्यवाद!
मैट बॉल

32
मुझे माफ कर दो अगर मैं गलत हूं, लेकिन क्या आपको str.substring के मूल्य को फिर से करने की आवश्यकता नहीं है? जैसेstr = str.substring(0, str.length -1);
डॉग मोलिनक्स

10
sliceऔर substringतरीकों सभी सबसे समान हैं; सिवाय इसके कि slice()एक नकारात्मक सूचकांक को स्वीकार करता है, स्ट्रिंग के अंत के सापेक्ष, लेकिन नहीं substring, यह out-of-boundत्रुटि फेंकता है
अमोल एम कुलकर्णी

20
मामले में कोई भी सोच रहा है, substringकी तुलना में 11% तेज है slicejsperf.com/js-slice-vs-substring-test
BenR

19
सबस्ट्रिंग पागल सूक्ष्म अनुकूलन है जो मुझे नहीं लगता कि आपको करना चाहिए। पहले पठनीयता के लिए अधिकतम करें। यदि आवश्यक हो तो कम फांसी फल का अनुकूलन।
अल्फ्रेड

1306

आप स्लाइस का उपयोग कर सकते हैं ! आपको बस यह सुनिश्चित करना है कि आप इसका उपयोग करना जानते हैं। सकारात्मक # शुरुआत के सापेक्ष हैं, नकारात्मक संख्या अंत के सापेक्ष हैं।

js>"12345.00".slice(0,-1)
12345.0

75
स्वीकृत समाधान की तुलना में, यह अधिक सुरुचिपूर्ण है और इसका उपयोग गतिशील रूप से बनाए गए तारों के साथ भी किया जा सकता है
समीर अलीभाई

1
मुझे इस तरह से पसंद है क्योंकि यह रूट फ़ंक्शन के लिए php सोच के साथ रहता है, मक्खी पर याद रखना और लिखना आसान है।
पाथफाइंडर

1
@SameerAlibhai मैं आपसे सहमत हूं, लेकिन क्या substringविधि का उपयोग गतिशील तारों पर भी नहीं किया जा सकता है? Str.length का उपयोग करके गतिशील रूप से लंबाई प्राप्त करें?
डग मोलेनक्स

जोड़ा जाना चाहिए कि पहला सूचकांक समावेशी है और दूसरा अनन्य है।
मिस्रीट्रेन

@KevinBeal आप मुख्यधारा के ब्राउज़रों में F12 का उपयोग कर सकते हैं और इसे कंसोल में दर्ज कर सकते हैं, किसी भी पेज पर काम कर सकते हैं और आपके पास संदर्भ भी हो सकते हैं और लाइब्रेरी लोड हो सकती हैं।
ट्वीस्टरेब जुब

263

आप जावास्क्रिप्ट स्ट्रिंग ऑब्जेक्ट्स की प्रतिस्थापन विधि का उपयोग कर सकते हैं :

s = s.substring(0, s.length - 4)

यह बिना शर्त के अंतिम चार वर्णों को हटा देता है s

हालाँकि, यदि आप अंतिम चार वर्णों को सशर्त रूप से निकालना चाहते हैं , केवल यदि वे ठीक हैं _bar :

var re = /_bar$/;
s.replace(re, "");

107
sliceयहाँ बेहतर है। s.slice(0, -4)
टिम डाउन

12
वैकल्पिक रूप से: s.slice (0, - "_ bar" .length) (उपयोगी यदि कोई वर्णों की संख्या को हार्डकोड नहीं करना चाहता है)
Mahn

3
मुझे यह पसंद है क्योंकि वह एक निर्दिष्ट अंत की जगह के लिए मदद भी देता है।
माइक ग्रेफ

162

सबसे आसान तरीका sliceस्ट्रिंग की विधि का उपयोग करना है , जो नकारात्मक स्थिति (स्ट्रिंग के अंत से ऑफसेट के अनुरूप) की अनुमति देता है:

const s = "your string";
const withoutLastFourChars = s.slice(0, -4);

यदि आपको पिछले अंडरस्कोर के बाद (और सहित) सब कुछ निकालने के लिए कुछ और सामान्य की आवश्यकता होती है, तो आप निम्न कर सकते हैं (इसलिए जब तक कि sकम से कम एक अंडरस्कोर शामिल करने की गारंटी न हो):

const s = "your_string";
const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
console.log(withoutLastChunk);


67

आपके उदाहरण जैसी संख्या के लिए, मैं यह करने की सलाह दूंगा substring:

console.log(parseFloat('12345.00').toFixed(1));

ध्यान दें कि यह वास्तव में संख्या को गोल करेगा, हालांकि, जो मुझे लगता है कि वांछित है, लेकिन शायद नहीं:

console.log(parseFloat('12345.46').toFixed(1));


11
+1 यह वही है जिसे ओपी की जरूरत है, इस गलत धारणा को भूल जाएं कि छंटनी की जा रही है।
नौगटुर

2
यह एक गलत धारणा नहीं है, ओपी स्ट्रिंग्स के बारे में बात करता है। तुम्हारा होना एक गलत धारणा है क्योंकि ओपी गोल संख्याओं के बारे में बात नहीं करता है।
फर्नांडो

30

जावास्क्रिप्ट के स्लाइस फ़ंक्शन का उपयोग करना:

let string = 'foo_bar';
string = string.slice(0, -4); // Slice off last four characters here
console.log(string);

यह किसी भी लम्बाई के एक स्ट्रिंग के अंत में '_bar' को हटाने के लिए इस्तेमाल किया जा सकता है।


19

एक नियमित अभिव्यक्ति वह है जिसे आप ढूंढ रहे हैं:

let str = "foo_bar";
console.log(str.replace(/_bar$/, ""));


आपका समाधान काम करता है, लेकिन एलेक्स का जवाब अधिक व्यापक है। इसलिए मैं उसकी बात मानूंगा। धन्यवाद!
अल्बर्ट

1
यह अंधाधुंध छंटनी के बजाय सशर्त हटाने की संबंधित समस्या को हल करता है
एरोन



9

रेगेक्स का उपयोग करें:

let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);


यूनिकोड-जागरूक नहीं होने के अलावा, यह लाइन ब्रेक से भी मेल नहीं खाता है।
user4642212

7
  1. (। *), किसी भी वर्ण को कई बार पकड़ता है

console.log("a string".match(/(.*).$/)[1]);

  1. , इस मामले में, अंतिम चरित्र से मेल खाता है

console.log("a string".match(/(.*).$/));

  1. $, स्ट्रिंग के अंत से मेल खाता है

console.log("a string".match(/(.*).{2}$/)[1]);


9
मुझे यह पसंद है क्योंकि इसके बावजूद .splice () में आपको एक नियमित अभिव्यक्ति का उपयोग करने का एक तरीका मिला।
क्यू। हैमर

यूनिकोड-जागरूक नहीं होने के अलावा, यह लाइन ब्रेक से भी मेल नहीं खाता है।
user4642212


5

यहाँ एक विकल्प है कि मुझे नहीं लगता कि मैंने अन्य उत्तरों में देखा है, सिर्फ मनोरंजन के लिए।

var strArr = "hello i'm a string".split("");
strArr.pop();
document.write(strArr.join(""));

स्लाइस या विकल्प के रूप में सुपाठ्य या सरल नहीं है, लेकिन आपको कुछ अच्छे सरणी तरीकों का उपयोग करके स्ट्रिंग के साथ खेलने की अनुमति देता है, इसलिए जानने के लायक है।


4
debris = string.split("_") //explode string into array of strings indexed by "_"

debris.pop(); //pop last element off the array (which you didn't want)

result = debris.join("_"); //fuse the remainng items together like the sun

3

यदि आप अंतिम वर्ण को केवल ट्रिम करने के बजाय, फ़्लोट्स का सामान्य राउंडिंग करना चाहते हैं:

var float1 = 12345.00,
    float2 = 12345.4567,
    float3 = 12345.982;

var MoreMath = {
    /**
     * Rounds a value to the specified number of decimals
     * @param float value The value to be rounded
     * @param int nrDecimals The number of decimals to round value to
     * @return float value rounded to nrDecimals decimals
     */
    round: function (value, nrDecimals) {
        var x = nrDecimals > 0 ? 10 * parseInt(nrDecimals, 10) : 1;
        return Math.round(value * x) / x;
    }
}

MoreMath.round(float1, 1) => 12345.0
MoreMath.round(float2, 1) => 12345.5
MoreMath.round(float3, 1) => 12346.0

संपादित करें: ऐसा लगता है कि पाओलो बताते हैं कि इसके लिए एक निर्मित फ़ंक्शन मौजूद है। यह समाधान स्पष्ट रूप से मेरी तुलना में बहुत साफ है। ParseFloat का उपयोग करें इसके बाद Fixed करें





1

प्रदर्शन

आज 2020.05.13 मैं MacOs हाई सिएरा v10.13.6 पर Chrome v81.0, Safari v13.1 और फ़ायरफ़ॉक्स v76.0 पर चुने हुए समाधानों का परीक्षण करता हूँ।

निष्कर्ष

  • slice(0,-1)(डी) तेज या छोटी और लंबी तार के लिए सबसे तेजी से समाधान है और यह तेजी से पार ब्राउज़र समाधान के रूप में सिफारिश की है
  • समाधान substring(C) औरsubstr (E) तेज हैं
  • नियमित अभिव्यक्ति (ए, बी) पर आधारित समाधान धीमे / मध्यम तेज हैं
  • समाधान बी, एफ और जी लंबे तार के लिए धीमा हैं
  • समाधान एफ छोटे तारों के लिए सबसे धीमा है, जी लंबे तारों के लिए सबसे धीमा है

यहां छवि विवरण दर्ज करें

विवरण

मैं समाधान A , B , C , D , E ( ext ), F , G (my) के लिए दो परीक्षण करता हूं

  • 8-चार लघु स्ट्रिंग (ओपी प्रश्न से) के लिए - आप इसे यहां चला सकते हैं
  • 1M लंबी स्ट्रिंग के लिए - आप इसे यहाँ चला सकते हैं

समाधान स्निपेट के नीचे प्रस्तुत किए गए हैं

यहां संक्षिप्त स्ट्रिंग के लिए Chrome के उदाहरण परिणाम दिए गए हैं

यहां छवि विवरण दर्ज करें


0

ध्यान रखें कि String.prototype.{ split, slice, substr, substring }UTF-16 एन्कोडेड स्ट्रिंग्स पर काम करते हैं

पिछले उत्तरों में से कोई भी यूनिकोड-जागरूक नहीं है। अधिकांश आधुनिक जावास्क्रिप्ट इंजनों में स्ट्रिंग्स को UTF-16 के रूप में एन्कोड किया गया है, लेकिन उच्चतर यूनिकोड कोड बिंदुओं को सरोगेट जोड़े की आवश्यकता होती है , इसलिए पुराने, पहले से मौजूद स्ट्रिंग तरीके UTF-16 कोड इकाइयों पर काम करते हैं, न कि यूनिकोड कोड पॉइंट्स।

const string = "ẞ🦊";

console.log(string.slice(0, -1)); // "ẞ\ud83e"
console.log(string.substr(0, string.length - 1)); // "ẞ\ud83e"
console.log(string.substring(0, string.length - 1)); // "ẞ\ud83e"
console.log(string.replace(/.$/, "")); // "ẞ\ud83e"
console.log(string.match(/(.*).$/)[1]); // "ẞ\ud83e"

const utf16Chars = string.split("");

utf16Chars.pop();
console.log(utf16Chars.join("")); // "ẞ\ud83e"

इसके अलावा, RegExp जवाब उनके वर्तमान रूप में अंत में लाइन टूटने से मेल नहीं खाते:

const string = "Hello, world!\n";

console.log(string.replace(/.$/, "").endsWith("\n")); // true
console.log(string.match(/(.*).$/) === null); // true


वर्णों को पुनरावृत्त करने के लिए स्ट्रिंग इट्रेटर का उपयोग करें

यूनिकोड-जागरूक कोड स्ट्रिंग के पुनरावृत्त का उपयोग करता है; देखें Array.fromऔर ...फैलाएंstring[Symbol.iterator]के stringरूप में अच्छी तरह से इस्तेमाल किया जा सकता है (जैसे के बजाय )।

यह भी देखें कि जावास्क्रिप्ट में पात्रों को यूनिकोड स्ट्रिंग कैसे विभाजित किया जाए

उदाहरण:

const string = "ẞ🦊";

console.log(Array.from(string).slice(0, -1).join("")); // "ẞ"
console.log([
  ...string
].slice(0, -1).join("")); // "ẞ"

झंडे sऔर uझंडे का प्रयोग करें aRegExp

dotAllया sझंडा बनाता .मैच लाइन ब्रेक वर्णों, unicodeया uझंडा कुछ यूनिकोड-संबंधी सुविधाओं सक्षम बनाता है।

उदाहरण:

const unicodeString = "ẞ🦊",
  lineBreakString = "Hello, world!\n";

console.log(lineBreakString.replace(/.$/s, "").endsWith("\n")); // false
console.log(lineBreakString.match(/(.*).$/s) === null); // false
console.log(unicodeString.replace(/.$/su, "")); // ẞ
console.log(unicodeString.match(/(.*).$/su)[1]); // ẞ

// Now `split` can be made Unicode-aware:

const unicodeCharacterArray = unicodeString.split(/(?:)/su),
  lineBreakCharacterArray = lineBreakString.split(/(?:)/su);

unicodeCharacterArray.pop();
lineBreakCharacterArray.pop();
console.log(unicodeCharacterArray.join("")); // "ẞ"
console.log(lineBreakCharacterArray.join("").endsWith("\n")); // false


ध्यान दें कि कुछ अंगूरों में एक से अधिक कोड बिंदु 🏳️‍🌈होते हैं , जैसे कि अनुक्रम 🏳(U + 1F3F3), VS16(U + FE0F) , ZWJ(U + 200D) , 🌈(U + 1F308)। यहाँ, यहाँ तक कि Array.fromइसे चार "वर्णों" में विभाजित किया जाएगा। यूनिकोड संपत्ति के साथ मिलान संभव है अनुक्रम गुण प्रस्ताव से बच जाता है


-1

उन मामलों में जहां आप किसी चीज को हटाना चाहते हैं, जो एक स्ट्रिंग के अंत के करीब है (चर आकार के तार के मामले में) आप स्लाइस () और रूट () को जोड़ सकते हैं।

मेरे पास मार्कअप के साथ एक स्ट्रिंग थी, गतिशील रूप से निर्मित, एंकर टैग की एक सूची के साथ अल्पविराम द्वारा अलग। स्ट्रिंग कुछ इस तरह था:

var str = "<a>text 1,</a><a>text 2,</a><a>text 2.3,</a><a>text abc,</a>";

अंतिम अल्पविराम को हटाने के लिए मैंने निम्नलिखित कार्य किया:

str = str.slice(0, -5) + str.substr(-4);

-3

@ जेसन एस:

आप स्लाइस का उपयोग कर सकते हैं! आपको बस यह सुनिश्चित करना है कि आप इसका उपयोग करना जानते हैं। सकारात्मक # शुरुआत के सापेक्ष हैं, नकारात्मक संख्या अंत के सापेक्ष हैं।

js> "12345.00" .slice (0, -1) 12345.0

मेरे ग्राफोमनी के लिए क्षमा करें, लेकिन पोस्ट को पहले 'jquery' में टैग किया गया था। इसलिए, आप jQuery के अंदर स्लाइस () का उपयोग नहीं कर सकते क्योंकि स्लाइस () डोम तत्वों के साथ संचालन के लिए jQuery विधि है, न कि सबस्ट्रिंग ... दूसरे शब्दों में जवाब @Jon Erickson कि सुझाव वास्तव में सही समाधान है।

हालाँकि, आपकी विधि सरल जावास्क्रिप्ट के अंदर, jQuery फ़ंक्शन से बाहर काम करेगी। टिप्पणियों में अंतिम चर्चा के कारण कहने की आवश्यकता है, कि jQuery अपने स्वयं के माता-पिता द्वारा ज्ञात ECMAScript की तुलना में JS के बहुत अधिक बार नवीकरणीय विस्तार है।

यहाँ भी दो तरीके मौजूद हैं:

जैसा हमारा:

string.substring(from,to) प्लस के रूप में अगर 'से' सूचकांक nulled स्ट्रिंग के बाकी देता है। इसलिए: string.substring(from) सकारात्मक या नकारात्मक ...

और कुछ अन्य - पदार्थ () - जो प्रतिस्थापन की सीमा प्रदान करते हैं और 'लंबाई' केवल सकारात्मक हो सकती है: string.substr(start,length)

इसके अलावा कुछ अनुरक्षकों का सुझाव है कि अंतिम विधि string.substr(start,length)MSIE के लिए त्रुटि के साथ काम नहीं करती है या काम नहीं करती है।


2
क्या मतलब? String.prototype.sliceएक मूल विधि है
naugtur

यह केवल वही है जो आपने कहा था। जावास्क्रिप्ट मूल विधि, लेकिन slice()डोम हेरफेर के लिए jQuery विधि: jQuery एपीआई: .slice () । AND SURE, जो कि JS Array.slice () की बहुरूपित विरासत की तरह हो सकता है, लेकिन यह दो अलग-अलग विधियां हैं, और मुझे लगता है कि इसे अलग बताने की जरूरत है। तो यह सिर्फ इस ज्ञान के लिए एक अनुमान है।
स्विफ्ट

11
यदि आप .sliceएक चर पर कॉल करते हैं जो एक स्ट्रिंग है, तो यह वही करने जा रहा है जो ओपी चाहता था। इससे कोई फर्क नहीं पड़ता कि यह "jQuery के अंदर" है और ऐसा कोई तरीका नहीं है जो किसी भी तरह से "हस्तक्षेप" कर सकता है जब तक आप String.prototypejQuery के साथ ओवरराइट नहीं करते हैं , जो मुझे यकीन है कि किसी भी जावास्क्रिप्ट कोड को काम करने से रोक देगा। आपका उत्तर सिर्फ यही कहता है कि अन्य उत्तर अच्छा नहीं है और आपके द्वारा दिया गया तर्क गलत है।
नौगटुर

1
मैं @naugtur से सहमत हो सकता हूं यह उत्तर गलत है, स्ट्रिंग का स्लाइस विधि jQuery द्वारा प्रभावित नहीं है।
13:58 पर पुनर्वसन

1
मुझे लगता है कि बिंदु नौगटूर बस बना रहा था, संभवत:, आप एक jQuery ऑब्जेक्ट द्वारा लिपटे स्ट्रिंग के साथ समाप्त हो सकते हैं (उदाहरण के लिए यदि आप कुछ फैंसी .dataहेरफेर करते हैं और इस "स्ट्रिंग" के साथ समाप्त होते हैं), जिसे अगर आपने sliceइसे बुलाया , तो आप जो चाहते हैं वह नहीं करेंगे। उस ने कहा, यह वास्तव में एक उपयोगी जवाब नहीं है।
mAAdhaTTah

-3

इसे इस्तेमाल करे:

<script>
    var x="foo_foo_foo_bar";
    for (var i=0; i<=x.length; i++) {
        if (x[i]=="_" && x[i+1]=="b") {
            break;
        }
        else {
            document.write(x[i]);
        }
    }
</script>

आप http://jsfiddle.net/informativejavascript/F7WTn/87/ पर लाइव वर्किंग उदाहरण भी आज़मा सकते हैं ।


3
धन्यवाद कमल। हालाँकि, मैंने ऊपर दिए गए उत्तर को अपनी आवश्यकताओं के लिए स्वीकार कर लिया है। ऊपर हरे रंग का चेक मार्क देखें। हालाँकि, मैंने आपका कोड जाँच लिया था। :) अब, मेरी स्थिति में, मैं केवल सामान्य अंत चरित्र अनुक्रम जानता हूं। बेहतर होगा कि आप स्ट्रिंग के अंत से ही जांच शुरू कर दें। यदि मेरा स्ट्रिंग "foo_b_bar" जैसा दिखता है, तो आपका सुझाव विफल हो जाएगा, और मैं केवल अंतिम "_bar" निकालना चाहता हूं। हालांकि धन्यवाद! 2 साल पहले एक सवाल पूछना काफी दिलचस्प अनुभव है, और आज भी इसके जवाब मिलते हैं। :)
अल्बर्ट

-8

_Bar के बाईं ओर सब कुछ प्राप्त करने के लिए विकल्प का उपयोग करें। लेकिन पहले आपको स्ट्रिंग में _bar का इंस्ट्रूमेंट प्राप्त करना होगा:

str.substring(3, 7);

3 यह है कि प्रारंभ और 7 की लंबाई है।


1
यह केवल "foo_bar" पर "foo_foo_bar" पर काम करता है, सवाल किसी भी लंबाई के साथ एक स्ट्रिंग के बारे में था लेकिन एक ज्ञात अंत था।
एड्रियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.