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...

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.

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];

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!


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

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


5

najłatwiejszym sposobem byłoby coś takiego:

var address = theEncodedString.split(/~/)
var name = address[0], street = address[1]

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];
        }
    }
}

4

Coś jak:

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

Prawdopodobnie będzie najłatwiej


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.


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


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(",");

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/


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"

1

Spróbuj w zwykłym Javascript

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

 var ar= [url,statu] = window.location.href.split("=");

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(',')

-1

Użyj tego kodu -

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

}
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.