Usuń pierwszy znak ciągu w Javascript


505

Chcę usunąć pierwszy znak ciągu, jeśli pierwszym znakiem jest 0. 0 może być tam więcej niż jeden raz.

Czy istnieje prosta funkcja, która sprawdza pierwszy znak i usuwa go, jeśli ma wartość 0?

W tej chwili próbuję tego z slice()funkcją JS, ale jest to bardzo niewygodne.

Odpowiedzi:


763

Możesz usunąć pierwszy znak ciągu, używając substr:

var s1 = "foobar";
var s2 = s1.substr(1);
alert(s2); // shows "oobar"

Aby usunąć wszystkie zera na początku ciągu:

var s = "0000test";
while(s.charAt(0) === '0')
{
 s = s.substr(1);
}

11
@Stephen: W tym przypadku nie zrobiłoby to różnicy, ponieważ charAtzawsze zwraca łańcuch, nawet jeśli indeks przekracza indeks ostatniego znaku, więc nie jest wykonywany przymus typu, a algorytm jest identyczny. Ale wolę ===ponad, ==nawet jeśli to nie robi różnicy. ;)
user113716,

4
@Hejner: Jeśli typy są takie same, jak zawsze, że będzie w tym przypadku, to ===i ==wykonywać dokładnie te same czynności (w zależności od specyfikacji, co najmniej), więc nie ma powodu, by spodziewać się jednego, aby lepiej wykonywać niż inne .
Tim Down

2
@MiguelCoder. Zgodnie ze specyfikacją kroki są takie same (implementacje przeglądarki mogą się oczywiście różnić). Przeczytaj, jeśli mi nie wierzysz.
Tim Down

3
@ReallyNiceCode pomija fakt, że pytanie zostało zadane ponad 8 lat temu. Stwierdzono: „0 może być tam więcej niż jeden raz”. i pytający zaakceptował moje rozwiązanie.
Cieniowany

6
Chociaż nadal jest ważny, powinieneś zaktualizować swoją odpowiedź, zastępując substrsubstring. Sprawdź MDN: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Soul Reaver

186

Bardzo czytelnym kodem jest użycie .substring()z zestawem początkowym do indeksowania drugiego znaku (1) (pierwszy znak ma indeks 0). Drugi parametr .substring()metody jest w rzeczywistości opcjonalny, więc nie musisz nawet wywoływać .length()...

TL; DR: Usuń pierwszy znak z ciągu:

str = str.substring(1);

... tak, to takie proste ...

Usuwanie niektórych określonych postaci:

Jak sugeruje @Shaded, po prostu zapętl to, a pierwszym znakiem w łańcuchu jest „niechciany” znak ...

var yourString = "0000test";
var unwantedCharacter = "0";
//there is really no need for === check, since we use String's charAt()
while( yourString.charAt(0) == unwantedCharacter ) yourString = yourString.substr(1);
//yourString now contains "test"

.slice()vs .substring()vs.substr()

Cytat z (i więcej na ten temat w) Jaka jest różnica między String.slice i String.substring?

Wskazuje również, że jeśli parametry do krojenia są ujemne, odnoszą się do ciągu od końca. Podciąg i substrat nie.



61

Najłatwiejszym sposobem na usunięcie wszystkich wiodących elementów 0jest:

var s = "00test";
s = s.replace(/^0+/, "");

Jeśli po prostu pozbędziesz się jednej wiodącej 0postaci, jak sugeruje to pytanie, możesz użyć

s = s.replace(/^0/, "");

26

Możesz to zrobić za pomocą metody substring :

let a = "My test string";

a = a.substring(1);

console.log(a); // y test string


7
var s = "0test";
if(s.substr(0,1) == "0") {
    s = s.substr(1);
}

Dla wszystkich 0: http://jsfiddle.net/An4MY/

String.prototype.ltrim0 = function() {
 return this.replace(/^[0]+/,"");
}
var s = "0000test".ltrim0();

Tak, to zadziałałoby, gdyby tylko jedno 0 było w ciągu. Ale potrzebuję go również, jeśli ciąg znaków wygląda jak var s = "00test0"; wtedy tylko pierwsze dwa 0 musiały zostać zastąpione
Jings

1
Dlaczego nie charAt? Dlaczego nawiasy? Dlaczego rozszerzenie prototypu? Fuj
Ry-

6
//---- remove first and last char of str    
str = str.substring(1,((keyw.length)-1));

//---- remove only first char    
str = str.substring(1,(keyw.length));

//---- remove only last char    
str = str.substring(0,(keyw.length));

4

String.prototype.trimStartWhile = function(predicate) {
    if (typeof predicate !== "function") {
    	return this;
    }
    let len = this.length;
    if (len === 0) {
        return this;
    }
    let s = this, i = 0;
    while (i < len && predicate(s[i])) {
    	i++;
    }
    return s.substr(i)
}

let str = "0000000000ABC",
    r = str.trimStartWhile(c => c === '0');
    
console.log(r);


3

Oto jeden, który nie zakłada, że ​​dane wejściowe to string, używa substringi zawiera kilka testów jednostkowych:

var cutOutZero = function(value) {
    if (value.length && value.length > 0 && value[0] === '0') {
        return value.substring(1);
    }

    return value;
};

http://jsfiddle.net/TRU66/1/



0
var test = '0test';
test = test.replace(/0(.*)/, '$1');

2
To nie działa zgodnie z oczekiwaniami i jest również naprawdę nieefektywne.
Ry-

0

Z implementacji JavaScript trim ()>, która usuwa ciągi początkowe lub końcowe spacji. Oto zmieniona implementacja odpowiedzi na to pytanie.

var str = "0000one two three0000"; //TEST  
str = str.replace(/^\s+|\s+$/g,'0'); //ANSWER

Oryginalna implementacja tego w JS

string.trim():
if (!String.prototype.trim) {
 String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,'');
 }
}

nie uważamy zamieszania za problem związany z implementacją, jednak często przypisuje się to brakowi zdolności do nadążania za zmiennymi, które przedstawia ci środowisko. W takim przypadku twoje połączenia neuronowe nie są w stanie obsłużyć niezbędnego zrozumienia tego zmienionego przyjęcia natywnej implementacji funkcji js jako odpowiedzi na pierwotne pytanie.
fino
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.