Jak rozdzielić łańcuch, przerywając określoną postać?

533

Mam ten ciąg

'john smith~123 Street~Apt 4~New York~NY~12345'

Przy użyciu JavaScript, jaki jest najszybszy sposób na przetworzenie tego

var name = "john smith";
var street= "123 Street";
//etc...
ctrlShiftBryan
źródło

Odpowiedzi:

845

Dzięki String.prototype.splitfunkcji JavaScript :

var input = 'john smith~123 Street~Apt 4~New York~NY~12345';

var fields = input.split('~');

var name = fields[0];
var street = fields[1];
// etc.
Zach
źródło
51

Nie potrzebujesz jQuery.

var s = 'john smith~123 Street~Apt 4~New York~NY~12345';
var fields = s.split(/~/);
var name = fields[0];
var street = fields[1];
Grant Wagner
źródło
53
Nie musisz dodawać wyrażenia regularnego do tej prostej zamiany. Spowolni to, jeśli cokolwiek. Możesz go zamienić na znaki cudzysłowu, aby zamienić prosty ciąg.
Anish Gupta,
47

Według ECMAScript6 ES6czystym sposobem są tablice destrukcyjne:

const input = 'john smith~123 Street~Apt 4~New York~NY~12345';

const [name, street, unit, city, state, zip] = input.split('~');

console.log(name); // john smith
console.log(street); // 123 Street
console.log(unit); // Apt 4
console.log(city); // New York
console.log(state); // NY
console.log(zip); // 12345

Możesz mieć dodatkowe elementy w ciągu wejściowym. W takim przypadku możesz użyć operatora rest, aby uzyskać tablicę dla reszty lub po prostu je zignorować:

const input = 'john smith~123 Street~Apt 4~New York~NY~12345';

const [name, street, ...others] = input.split('~');

console.log(name); // john smith
console.log(street); // 123 Street
console.log(others); // ["Apt 4", "New York", "NY", "12345"]

Przypuszczałem, że wartości odnoszą się tylko do odczytu i użyłem constdeklaracji.

Ciesz się ES6!

Vahid Hallaji
źródło
6
Możesz także pominąć przedmiot:const [name, , unit, ...others] = ...
Sallar,
16

Chociaż nie jest to najprostszy sposób, możesz to zrobić:

var addressString = "~john smith~123 Street~Apt 4~New York~NY~12345~",
    keys = "name address1 address2 city state zipcode".split(" "),
    address = {};

// clean up the string with the first replace
// "abuse" the second replace to map the keys to the matches
addressString.replace(/^~|~$/g).replace(/[^~]+/g, function(match){
    address[ keys.unshift() ] = match;
});

// address will contain the mapped result
address = {
    address1: "123 Street"
    address2: "Apt 4"
    city: "New York"
    name: "john smith"
    state: "NY"
    zipcode: "12345"
}

Aktualizacja dla ES2015 z wykorzystaniem destrukcji

const [address1, address2, city, name, state, zipcode] = addressString.match(/[^~]+/g);

// The variables defined above now contain the appropriate information:

console.log(address1, address2, city, name, state, zipcode);
// -> john smith 123 Street Apt 4 New York NY 12345
Torsten Walter
źródło
4
najpierw mamy ciąg oddzielony znakami „~” i tablicą keys. Druga funkcja zamiany służy [^~]+do dopasowania każdej innej części (tj. „123 Street”, „Apt 4” itp.) I wywołuje funkcję dla każdej części, przekazując ją jako argument. Przy każdym uruchomieniu funkcja pobiera pierwszy klucz z tablicy klawiszy (usuwając go również za pomocą Array.unshift) i przypisuje klucz i część do obiektu adresu.
ewino
13

Będziemy chcieli, aby spojrzeć na funkcje Javascript jest substr lub rozłamu , gdyż nie jest to zadanie nadaje się do jQuery.

John Sheehan
źródło
5

najłatwiejszym sposobem byłoby coś takiego:

var address = theEncodedString.split(/~/)
var name = address[0], street = address[1]
Dan
źródło
5

Jeśli znaleziono Spliter, to tylko

Podziel To

w przeciwnym razie zwróci ten sam ciąg

function SplitTheString(ResultStr) {
    if (ResultStr != null) {
        var SplitChars = '~';
        if (ResultStr.indexOf(SplitChars) >= 0) {
            var DtlStr = ResultStr.split(SplitChars);
            var name  = DtlStr[0];
            var street = DtlStr[1];
        }
    }
}
BJ Patel
źródło
4

Coś jak:

var divided = str.split("/~/");
var name=divided[0];
var street = divided[1];

Prawdopodobnie będzie najłatwiej

Steve G.
źródło
2
Nie chcesz, albo split("~")czy split(/~/)jednak nie split("/~/"). Ten ostatni podzieliłby się tylko "John/~/Smith"i nie "John~Smith".
Andrew Willems,
4

Możesz użyć splitdo podziału tekstu.

Alternatywnie możesz użyć również matchw następujący sposób

var str = 'john smith~123 Street~Apt 4~New York~NY~12345';
matches = str.match(/[^~]+/g);

console.log(matches);
document.write(matches);

Wyrażenie regularne [^~]+dopasuje wszystkie znaki z wyjątkiem ~i zwróci dopasowania w tablicy. Następnie możesz wyodrębnić z niego dopasowania.

Tuszar
źródło
1
To zadziałało dla mnie! str.split();nie działał w Firefoksie, ale działało to zarówno w Chrome, jak i Firefox.
Sandeep
1
@ Sandeep, nie, str.split(); działa w przeglądarce Firefox i we wszystkich głównych przeglądarkach .
Andrew Willems,
2

Zach miał to jedno prawo… używając jego metody można również stworzyć pozornie „wielowymiarową” tablicę. Stworzyłem szybki przykład na JSFiddle http://jsfiddle.net/LcnvJ/2/

// array[0][0] will produce brian
// array[0][1] will produce james

// array[1][0] will produce kevin
// array[1][1] will produce haley

var array = [];
    array[0] = "brian,james,doug".split(",");
    array[1] = "kevin,haley,steph".split(",");
Billy Hallman
źródło
2

JavaScript: Konwertuj ciąg na tablicę JavaScript Split Split

    var str = "This-javascript-tutorial-string-split-method-examples-tutsmake."
 
    var result = str.split('-'); 
     
    console.log(result);
     
    document.getElementById("show").innerHTML = result; 
<html>
<head>
<title>How do you split a string, breaking at a particular character in javascript?</title>
</head>
<body>
 
<p id="show"></p> 
 
</body>
</html>

https://www.tutsmake.com/javascript-convert-string-to-array-javascript/

Deweloper
źródło
1

To string.split("~")[0];załatwia sprawę.

źródło: String.prototype.split ()


Kolejne funkcjonalne podejście z wykorzystaniem curry i kompozycji funkcji.

Pierwszą rzeczą będzie funkcja podziału. Chcemy to "john smith~123 Street~Apt 4~New York~NY~12345"w to włączyć["john smith", "123 Street", "Apt 4", "New York", "NY", "12345"]

const split = (separator) => (text) => text.split(separator);
const splitByTilde = split('~');

Teraz możemy skorzystać z naszej specjalistycznej splitByTildefunkcji. Przykład:

splitByTilde("john smith~123 Street~Apt 4~New York~NY~12345") // ["john smith", "123 Street", "Apt 4", "New York", "NY", "12345"]

Aby uzyskać pierwszy element, możemy użyć list[0]operatora. Zbudujmy firstfunkcję:

const first = (list) => list[0];

Algorytm jest: podzielony przez dwukropek, a następnie pobierz pierwszy element z podanej listy. Możemy więc skomponować te funkcje, aby zbudować naszą ostateczną getNamefunkcję. Budowanie composefunkcji za pomocą reduce:

const compose = (...fns) => (value) => fns.reduceRight((acc, fn) => fn(acc), value);

A teraz używa go do komponowania splitByTildei firstfunkcji.

const getName = compose(first, splitByTilde);

let string = 'john smith~123 Street~Apt 4~New York~NY~12345';
getName(string); // "john smith"
leandrotk
źródło
1

Spróbuj w zwykłym Javascript

 //basic url=http://localhost:58227/ExternalApproval.html?Status=1

 var ar= [url,statu] = window.location.href.split("=");
Hari Lakkakula
źródło
0

Ponieważ pytanie dotyczące przecinków jest duplikowane w tym pytaniu, dodając to tutaj.

Jeśli chcesz podzielić na charakter i również obsługiwać dodatkowe spacje, które mogłyby wynikać, że charakter, który często bywa z przecinkami, można użyć replacewtedy split, jak poniżej:

var items = string.replace(/,\s+/, ",").split(',')
Chris Bartholomew
źródło
-1

Użyj tego kodu -

function myFunction() {
var str = "How are you doing today?";
var res = str.split("/");

}
Bal Mukund Kumar
źródło