Jak przekonwertować ciąg rozdzielany przecinkami na tablicę?


719

Mam ciąg oddzielony przecinkami, który chcę przekonwertować na tablicę, aby móc przez nią przechodzić.

Czy jest coś wbudowanego w to?

Na przykład mam ten ciąg

var str = "January,February,March,April,May,June,July,August,September,October,November,December";

teraz chcę podzielić to przecinkiem, a następnie zapisać go w tablicy.


7
Chciałem tylko skomentować, że nie wymaga to jquery, to część samego javascript.
Chris


4
Odnośnie duplikatu: poprzedza to pytanie o 18 miesięcy. Jeśli cokolwiek, to drugie jest nie tylko duplikatem, ale oferuje niezwykle skomplikowane rozwiązanie bardzo prostego problemu ze względu na wymaganie wyrażenia regularnego
NotMe

40
Łatwy. string.split(',');
Braden Best,

4
Nie jestem pewien, dlaczego jest to oznaczone jako „zbyt zlokalizowane”. Podział ciągów znaków pojawia się bardzo często i ogólnie odnosi się do ogólnoświatowej publiczności w Internecie (o czym świadczy fakt, że moja odpowiedź wciąż w jakiś sposób zyskuje popularność). Wątpię, aby 4 inne osoby przyszły i ponownie je otworzyły, ale nadal. Dziwne.
Matchu

Odpowiedzi:


1216
var array = string.split(',');

Odwołanie MDN , głównie pomocne w przypadku nieoczekiwanego zachowania limitparametru. (Wskazówka: "a,b,c".split(",", 2)wychodzi ["a", "b"], nie ["a", "b,c"].)


3
Krótko i słodko, miło widzieć, że JavaScript stringma bogactwo Java String.
Michael Shopsin

Najlepsza praktyka do obsługi wszystkich typów ciągów. Zobacz tutaj stackoverflow.com/a/32657055/2632619
Andi AR

6
Chociaż splitbędzie działać dobrze, jeśli masz pewność, że masz elementy array, jeśli oczekujesz danych z serwera / bazy danych, napotkasz problemy, ponieważ ''.split(',')ma length === 1IE:''.split(',') === ['']
oportocala

@MichaelShopsin i All, funkcja podziału nie działa z IE11, jak to mówi Nie można uzyskać właściwości „Split” niezdefiniowanego lub zerowego odwołania.
DLV

@DLV to brzmi jak nowe pytanie, być może powinieneś je zadać po sprawdzeniu pytań IE już na StackOverflow.
Michael Shopsin

130

Uważaj, jeśli celujesz na liczby całkowite, takie jak 1,2,3,4,5. Jeśli zamierzasz używać elementów tablicy jako liczb całkowitych, a nie jako łańcuchów po podzieleniu łańcucha, rozważ konwersję na takie.

var str = "1,2,3,4,5,6";
var temp = new Array();
// this will return an array with strings "1", "2", etc.
temp = str.split(",");

dodając taką pętlę

for (a in temp ) {
    temp[a] = parseInt(temp[a], 10); // Explicitly include base as per Álvaro's comment
}

zwróci tablicę zawierającą liczby całkowite, a nie ciągi.


47
Należy pamiętać, że parseInt () próbuje odgadnąć bazę, chyba że jawnie ją ustawisz, co może powodować nieoczekiwane wyniki podczas radzenia sobie z wiodącymi zerami ( "001,002,003..."). Porównaj parseInt('010')z parseInt('010', 10).
Álvaro González

3
Bardziej głosowałbym za komentarzem Alvaro, gdybym mógł. Nauczyłem się tej lekcji jakiś czas temu i nigdy jej nie zapomniałem.
Antony Scott

2
+1 Ten przykład jest bardziej przejrzysty, pokazując, że łańcuch nie jest obiektem statycznym, ale w rzeczywistości zmienną, która jest łańcuchem.
K0D4,

5
Tej mapfunkcji można użyć do parsowania liczb całkowitych w jednym wierszu:str.split(',').map(parseInt)
Jud

1
To nie jest najbardziej wydajne rozwiązanie. Według moich eksperymentów pod Chrome 49. JSON.parse ('[' + str + ']') jest o 40% szybszy niż to rozwiązanie.
Yao

33

Podział Hmm jest niebezpieczny, imho, ponieważ ciąg może zawsze zawierać przecinek, przestrzegaj następujących zasad:

var myArr = "a,b,c,d,e,f,g,','";
result = myArr.split(',');

Jak byś to zinterpretował? i jaki chcesz wynik? tablica z:

['a', 'b', 'c', 'd', 'e', 'f', 'g', '\'', '\''] or 
['a', 'b', 'c', 'd', 'e', 'f', 'g', ',']

nawet jeśli unikniesz przecinka, miałbyś problem.

Szybko pogrzebałem to razem:

(function($) {
    $.extend({
        splitAttrString: function(theStr) {
            var attrs = [];

            var RefString = function(s) {
                this.value = s;
            };
            RefString.prototype.toString = function() {
                return this.value;
            };
            RefString.prototype.charAt = String.prototype.charAt;
            var data = new RefString(theStr);

            var getBlock = function(endChr, restString) {
                var block = '';
                var currChr = '';
                while ((currChr != endChr) && (restString.value !== '')) {
                    if (/'|"/.test(currChr)) {
                        block = $.trim(block) + getBlock(currChr, restString);
                    }
                    else if (/\{/.test(currChr)) {
                        block = $.trim(block) + getBlock('}', restString);
                    }
                    else if (/\[/.test(currChr)) {
                        block = $.trim(block) + getBlock(']', restString);
                    }
                    else {
                        block += currChr;
                    }
                    currChr = restString.charAt(0);
                    restString.value = restString.value.slice(1);
                }
                return $.trim(block);
            };

            do {
                var attr = getBlock(',', data);
                attrs.push(attr);
            }
            while (data.value !== '');
            return attrs;
        }
    });
})(jQuery);

Możesz go używać / edytować :)


1
Działa to również świetnie z liczbami i nie musimy uruchamiać dla nich osobnej pętli parsowania, jak wspomniano w innej odpowiedzi poniżej. To jest naprawdę głębokie myślenie. Doceniam to bardzo i myślę, że najlepsza odpowiedź spośród wszystkich !!
Anmol Saraf

28

Metoda split () służy do dzielenia łańcucha na tablicę podciągów i zwraca nową tablicę.

var array = string.split(',');

jaki byłby wynik? na przykład, jeśli mam var a = "witaj, świecie, kochanie"; i var array = a.split (','); -> czy moja tablica wyglądałaby tak: array = [„hello”, „world”, „baby”]; ??
kluczowy programista

1
Tak to jest poprawne. Wynikowa tablica byłaby taka, jak wspomniałeś.
Jakkwylde

Twoja odpowiedź działa dla mnie, ale moja nowa tablica nie zastępuje starej. Możesz mi pomóc? var sampleTags = ['vinita@itsabacus.com']; console.log(sampleTags); $("#order_id").on("change", function() { var order_id = document.getElementById('order_id').value; $.ajax({url: "model/getUserMailIds.php",data:{order_id:order_id},type:'POST', success: function(result){ alert(result); var sampleTags = result.split(',');; console.log(sampleTags); }}); });
Vinita Pawar,


14

Przekaż ciąg rozdzielany przecinkami do tej funkcji, a zwróci tablicę, a jeśli nie zostanie znaleziony ciąg rozdzielony przecinkami, zwróci null.

 function splitTheString(CommaSepStr) {
       var ResultArray = null; 

// Check if the string is null or so.
        if (CommaSepStr!= null) {


             var SplitChars = ',';
   // Check if the string has comma of not will go to else
                if (CommaSepStr.indexOf(SplitChars) >= 0) {
                    ResultArray = CommaSepStr.split(SplitChars);

                }
             else { 
  // string has only one value, can also check the length of the string or time and cross-check too. 
                    ResultArray = [CommaSepStr]; 
              }
        }
       return ResultArray ;
    }

3
Zamiast pisać tylko blok kodu, wyjaśnij, dlaczego ten kod rozwiązuje postawiony problem. Bez wyjaśnienia nie jest to odpowiedź.
Martijn Pieters

1
Jest to najbardziej poprawne rozwiązanie, jeśli nie masz pewności, czy łańcuch będzie zawierał podzieloną wartość. Ta funkcja zapobiegnie pomyłkom metody split, jeśli łańcuch nie zawiera przecinka (w powyższym przykładzie).
CoryDorning,

1
Uwaga: funkcje rozpoczynające się od dużej litery są w większości przypadków zaprojektowane do wywołania. najlepiej używać małych liter w funkcjach, które nie zostały zaprojektowane do wywoływania.
Jsterman

Nie udało mi się, gdy miałem tylko jedną wartość bez przecinków. Dodano else { ResultArray = [CommaSepStr]; }po drugimif
Thomas Byy

Dzięki dodałem. to.
BJ Patel

8

Funkcja powrotu

var array = (new Function("return [" + str+ "];")());

jego ciąg znaków i ciągi obiektów

var string = "0,1";

var objectstring = '{Name:"Tshirt", CatGroupName:"Clothes", Gender:"male-female"}, {Name:"Dress", CatGroupName:"Clothes", Gender:"female"}, {Name:"Belt", CatGroupName:"Leather", Gender:"child"}';

var stringArray = (new Function("return [" + string+ "];")());

var objectStringArray = (new Function("return [" + objectstring+ "];")());

JSFiddle https://jsfiddle.net/7ne9L4Lj/1/


3
w ciągach tekstowych występują błędy - Składnia Błąd: Nieoczekiwane ciągi numerów identyfikacyjnych są prawidłowe. na przykład. var stringtext = "String, text, I, am"; var stringtextArray = (new Function("return [" + string text + "];")()); wynikiem jest: SyntaxError: Nieoczekiwany identyfikator
nycdanie

7

Wiem, że na to pytanie udzielono odpowiedzi od dłuższego czasu, ale pomyślałem, że mój wkład byłby korzystny dla innych badających ten temat ...

Oto funkcja, która przekonwertuje ciąg znaków na tablicę, nawet jeśli na liście jest tylko jeden element (bez znaku separatora):

function listToAray(fullString, separator) {
  var fullArray = [];

  if (fullString !== undefined) {
    if (fullString.indexOf(separator) == -1) {
      fullAray.push(fullString);
    } else {
      fullArray = fullString.split(separator);
    }
  }

  return fullArray;
}

Użyj tego w ten sposób:

var myString = 'alpha,bravo,charlie,delta';
var myArray = listToArray(myString, ',');
myArray[2]; // charlie

var yourString = 'echo';
var yourArray = listToArray(yourString, ',');
yourArray[0]; // echo

Stworzyłem tę funkcję, ponieważ splitzgłasza błąd, jeśli w ciągu nie ma znaku separatora (tylko jeden element)


3
Jeśli nie zostanie znaleziony separator, nie zostanie zgłoszony błąd: 'echo'.split(',')zwraca ['echo']i ''.split(',') zwraca ['']. Państwo będzie się błąd jeśli zadzwonisz x.split(','), kiedy xnie jest ciągiem znaków (w tym przypadku xjest niezdefiniowane lub wartość null ), ponieważ nie jest splitdostępna dla innych typów funkcji.
Joel Lee

Ach, widzę, że tak naprawdę próbowałem użyć splitdla niezdefiniowanego obiektu, kiedy napisałem moją funkcję listToArray. Dzięki za zwrócenie na to uwagi ...
Kabb5

6

Miałem podobny problem, ale bardziej skomplikowany, ponieważ musiałem przekształcić plik csv w tablicę tablic (każda linia to jeden element tablicy, który zawiera tablicę elementów podzieloną przecinkiem).

Najłatwiejszym rozwiązaniem (i bezpieczniej zakładam) było użycie PapaParse ( http://papaparse.com/ ), który ma opcję „bez nagłówka”, która przekształca csv w tablicę tablic, a ponadto automatycznie wykrył „ , ”jako mojego ogranicznika.

Dodatkowo jest zarejestrowany w altanie, więc musiałem tylko:

bower install papa-parse --save

a następnie użyj go w moim kodzie w następujący sposób:

var arrayOfArrays = Papa.parse(csvStringWithEnters), {header:false}).data;

Naprawdę mi się podobało.


5
let str = "January,February,March,April,May,June,July,August,September,October,November,December"

let arr = str.split(',');

spowoduje to:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

a jeśli chcesz przekonwertować następujące elementy na:

["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

to:

"January,February,March,April,May,June,July,August,September,October,November,December";

posługiwać się:

str = arr.join(',')

3

dobre rozwiązanie

let obj = ['A','B','C']

obj.map((c) => { return c. }).join(', ')

1

Tablica ciągów do łańcucha rozdzielanego przecinkami

let months = ["January","Feb"];
let monthsString = months.join(", ");

1

możesz wypróbować następujący fragment kodu

 var str = "How,are,you,doing,today?";
    var res = str.split(",");
    console.log("My Result:",res)

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.