W jaki sposób można podzielić ciąg tylko raz, tj make 1|Ceci n'est pas une pipe: | Oui
parse do: ["1", "Ceci n'est pas une pipe: | Oui"]
?
Limit w splicie nie wydaje się pomagać ...
javascript
split
Stavros Korokithakis
źródło
źródło
components.splice(0,2).slice(0,2)
Chciałbyś użyć,
String.indexOf('|')
aby uzyskać indeks pierwszego wystąpienia „|”.var i = s.indexOf('|'); var splits = [s.slice(0,i), s.slice(i+1)];
źródło
+1
rzeczywistości powinno to być długością łańcucha separatora, jeśli jest więcej niż jeden znak.var i = s.split('|',2).join('|').length;//2nd index
var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Możesz użyć:
var splits = str.match(/([^|]*)\|(.*)/); splits.shift();
Wyrażenie regularne dzieli ciąg na dwie pasujące grupy (w nawiasach), tekst poprzedzający pierwszy | a tekst po. Wtedy my
shift
wynik, aby pozbyć się całego ciągu match (splits[0]
).źródło
jedna wkładka i imo, prostsze:
var str = 'I | am super | cool | yea!'; str.split('|').slice(1).join('|');
Zwraca to „Jestem super | super | tak!”
źródło
Składnia ES6 pozwala na inne podejście:
function splitOnce(s, on) { [first, ...rest] = s.split(on) return [first, rest.length > 0? rest.join(on) : null] }
Który również obsługuje ewentualność łańcucha nie zawierającego a
|
, zwracając wartość null zamiast pustego ciągu, co jest bardziej wyraźne.splitOnce("1|Ceci n'est pas une pipe: | Oui", "|") >>> ["1", "Ceci n'est pas une pipe: | Oui"] splitOnce("Celui-ci n'a pas de pipe symbol!", "|") >>> ["Celui-ci n'a pas de pipe symbol!", null]
Dodałem tę odpowiedź przede wszystkim po to, aby móc zrobić kalambur na symbolu potoku, ale także po to, aby pochwalić się składnią es6 - to niesamowite, ile osób nadal jej nie używa ...
źródło
Spróbuj tego:
function splitOnce(input, splitBy) { var fullSplit = input.split(splitBy); var retVal = []; retVal.push( fullSplit.shift() ); retVal.push( fullSplit.join( splitBy ) ); return retVal; } var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');
źródło
Jeśli ciąg nie zawiera separatora, rozwiązanie @ NickCraver nadal zwróci tablicę dwóch elementów, z których drugi będzie pusty. Wolę zachowanie pasujące do podziału. Oznacza to, że jeśli ciąg wejściowy nie zawiera separatora, zwraca tylko tablicę z pojedynczym elementem.
var splitOnce = function(str, delim) { var components = str.split(delim); var result = [components.shift()]; if(components.length) { result.push(components.join(delim)); } return result; }; splitOnce("a b c d", " "); // ["a", "b c d"] splitOnce("a", " "); // ["a"]
źródło
Tak samo złe, jak większość dotychczasowych odpowiedzi:
var splits = str.split('|'); splits.splice(1, splits.length - 1, splits.slice(1).join('|'));
źródło
Alternatywnym, krótkim podejściem, oprócz towarów gdzie indziej, jest wykorzystanie
replace()
limitu na swoją korzyść.var str = "1|Ceci n'est pas une pipe: | Oui"; str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");
Jak @sreservoir wskazuje w komentarzach, unikalna fraza musi być naprawdę wyjątkowa - nie może znajdować się w źródle, w którym przeprowadzasz ten podział, w przeciwnym razie łańcuch zostanie podzielony na więcej części niż chcesz. Znak niedrukowalny, jak mówi, może zrobić, jeśli uruchamiasz to na podstawie danych wejściowych użytkownika (tj. Wpisywanych w przeglądarce).
źródło
Ten jest trochę dłuższy, ale wydaje mi się, że limit powinien:
function split_limit(inString, separator, limit){ var ary = inString.split(separator); var aryOut = ary.slice(0, limit - 1); if(ary[limit - 1]){ aryOut.push(ary.slice(limit - 1).join(separator)); } return aryOut; } console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1)); console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2)); console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3)); console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));
https://jsfiddle.net/2gyxuo2j/
limit Zero zwraca śmieszne wyniki, ale w imię wydajności pominąłem sprawdzanie. Możesz dodać to jako pierwszy wiersz funkcji, jeśli tego potrzebujesz:
if(limit < 1) return [];
źródło
jeśli chcesz użyć „rurociągu”,
reduce
to twój przyjacielconst separator = '|' jsonNode.split(separator) .reduce((previous, current, index) => { if (index < 2) previous.push(current) else previous[1] += `${separator}${current}` return previous }, []) .map((item: string) => (item.trim())) .filter((item: string) => (item != ''))
źródło
Bardziej skuteczna metoda:
const str = "1|Ceci n'est pas une pipe: | Oui" const [head] = str.split('|', 1); const result = [head, str.substr(head.length + 1)] console.log(result);
źródło
użyj funkcji wyrażeń regularnych javascript i weź pierwsze przechwycone wyrażenie.
RE prawdopodobnie by wyglądał
/^([^|]*)\|/
.w rzeczywistości potrzebujesz tylko
/[^|]*/
wtedy, gdy potwierdziłeś, że łańcuch jest sformatowany w taki sposób, ze względu na zachłanność wyrażeń regularnych javascript.źródło