Como converter uma string separada por vírgula em uma matriz?


720

Eu tenho uma string separada por vírgula que quero converter em uma matriz, para que eu possa fazer um loop através dela.

Existe algo embutido para fazer isso?

Por exemplo, eu tenho essa string

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

agora eu quero dividir isso pela vírgula e armazená-lo em uma matriz.


7
Só queria comentar que isso não requer jquery, isso faz parte do próprio javascript.
21711 Chris


4
Em relação à duplicata: antecede a pergunta referenciada em 18 meses. De qualquer forma, o outro não é apenas um idiota, mas oferece uma solução extremamente complicada para um problema muito simples devido ao requisito de regex
NotMe

40
Fácil. string.split(',');
Braden Best

4
Não sei por que isso está marcado como "muito localizado". A divisão de cordas ocorre muito e geralmente é aplicável ao público mundial da Internet (como evidenciado pelo fato de que minha resposta ainda de alguma forma é votada regularmente). Duvido que outras 4 pessoas venham e a reabram, mas ainda assim. Esquisito.
Matchu

Respostas:


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

Referência MDN , principalmente útil para o comportamento possivelmente inesperado do limitparâmetro. (Dica: "a,b,c".split(",", 2)sai para ["a", "b"], não ["a", "b,c"].)


3
Curto e doce, é bom ver que o JavaScript stringtem um pouco da riqueza do Java String.
Página Inicial>

Prática recomendada para oferecer suporte a todos os tipos de strings. Veja aqui stackoverflow.com/a/32657055/2632619
Andi AR

6
Enquanto splitbelo trabalho vontade se você tem certeza que tem elementos array, se você está esperando dados de um servidor / banco de dados que você vai ter problemas desde que ''.split(',')tem um length === 1IE:''.split(',') === ['']
oportocala

@MichaelShopsin e All, a função split não está funcionando com o IE11, como está dizendo Não é possível obter a propriedade 'Split' de referência nula ou indefinida.
DLV

@DLV que soa como uma nova pergunta, talvez você deva perguntar depois de verificar as perguntas do IE já existentes no StackOverflow.
Michael Shopsin

130

Cuidado se você está buscando números inteiros, como 1,2,3,4,5. Se você pretende usar os elementos de sua matriz como números inteiros e não como cadeias após dividir a cadeia, considere convertê-los em tais.

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

adicionando um loop como este

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

retornará uma matriz contendo números inteiros, e não cadeias.


47
Observe que parseInt () tenta adivinhar a base, a menos que você a defina explicitamente, o que pode causar resultados inesperados ao lidar com zeros à esquerda ( "001,002,003..."). Compare parseInt('010')com parseInt('010', 10).
Álvaro González

3
Eu votaria mais no comentário de Alvaro se pudesse. Aprendi essa lição há um tempo e nunca a esqueci.
Antony Scott

2
+1 Este exemplo é mais claro, demonstrando que a string não é um objeto estático, mas na verdade a variável que é a string.
K0D4 10/10

5
A mapfunção pode ser usada para fazer a análise de números inteiros em uma linha:str.split(',').map(parseInt)
Jud

1
Esta não é a solução mais eficiente. De acordo com meus experimentos no Chrome 49. JSON.parse ('[' + str + ']') é 40% mais rápido que esta solução.
Yao

33

A divisão Hmm é perigosa no imho, pois uma string sempre pode conter vírgula, observe o seguinte:

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

Então, como você interpretaria isso? e qual você quer que seja o resultado? uma matriz com:

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

mesmo se você escapar da vírgula, terá um problema.

Resolvi rapidamente isso:

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

Sinta-se livre para usá-lo / editá-lo :)


1
Isso funciona muito bem com os números também e não precisamos executar um loop parseInt separado para eles, como mencionado em outra resposta abaixo. Este é um pensamento muito profundo. Aprecio muito e acho a melhor resposta entre todas !!
Anmol Saraf

28

O método split () é usado para dividir uma string em uma matriz de substrings e retorna a nova matriz.

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

qual seria o resultado? por exemplo, se eu tiver var a = "olá, mundo, bebê"; e var array = a.split (','); -> minha matriz ficaria assim: array = ["olá", "mundo", "bebê"]; ??
pivotal developer

1
Sim, está correto. A matriz resultante seria exatamente como você mencionou.
Jakkwylde 23/03

Sua resposta está funcionando para mim, mas minha nova matriz não está substituindo a antiga. Pode me ajudar? 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 #

16

Observe que o seguinte:

 var a = "";
var x = new Array();
x = a.split(",");
alert(x.length);

irá alertar 1


14

Passe sua string separada por vírgula para esta função e ela retornará uma matriz; se não for encontrada uma string separada por vírgula, retornará nulo.

 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
Em vez de publicar apenas um bloco de código, explique por que esse código resolve o problema apresentado. Sem uma explicação, isso não é uma resposta.
Martijn Pieters

1
Esta é a solução mais correta se você não tiver certeza de que a sequência conterá seu valor de divisão. Essa função evita que o método split se engane se a string não tiver vírgula (dado o exemplo acima).
CoryDorning 11/03

1
Nota: as funções que começam com uma letra maiúscula são, na maioria das vezes, projetadas para serem chamadas. melhor usar letras minúsculas em funções que não foram projetadas para serem chamadas.
Jsterman

Isso falhou para mim quando eu tinha apenas um valor sem vírgulas. Adicionado else { ResultArray = [CommaSepStr]; }após o segundoif
Thomas Byy 06/02

Graças foram adicionados. isto.
BJ Patel

8

Função de retorno

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

é aceitar string e objetos

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
cadeias de texto estão com erros - SyntaxError: cadeias inesperadas de número de identificador estão ok. por exemplo. var stringtext = "String, text, I, am"; var stringtextArray = (new Function("return [" + string text + "];")()); O resultado é: SyntaxError: Identificador inesperado
nycdanie

7

Sei que essa pergunta foi respondida por um bom tempo, mas achei que minha contribuição seria benéfica para outras pessoas que pesquisam esse tópico ...

Aqui está uma função que converterá uma string em uma matriz, mesmo se houver apenas um item na lista (sem caractere separador):

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

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

  return fullArray;
}

Use-o assim:

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

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

Eu criei essa função porque splitgera um erro se não houver caractere separador na string (apenas um item)


3
Nenhum erro será gerado se o separador não for encontrado: 'echo'.split(',')retorna ['echo']e ''.split(',') retorna ['']. Você vai obter um erro se você chamar x.split(',')quando xnão é uma string (incluindo quando xé indefinido ou nulo ), porque não há nenhuma splitfunção disponível para outros tipos.
Joel Lee

Ah, vejo que, na verdade, eu estava tentando usar splitum objeto indefinido quando escrevi minha função listToArray. Obrigado por apontar isso ...
Kabb5

6

Eu tive um problema semelhante, mas mais complexo, pois precisava transformar um csv em uma matriz de matrizes (cada linha é um elemento da matriz que por dentro tem uma matriz de itens divididos por vírgula).

A solução mais fácil (e mais segura, aposto) foi usar o PapaParse ( http://papaparse.com/ ), que possui uma opção "sem cabeçalho" que transforma o csv em uma matriz de arrays, além de detectar automaticamente o " , "como meu delimitador.

Além disso, ele está registrado no caramanchão, então eu só precisava:

bower install papa-parse --save

e use-o no meu código da seguinte maneira:

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

Eu realmente gostei.


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

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

resultará:

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

e se você deseja converter o seguinte em:

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

isto:

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

usar:

str = arr.join(',')

3

boa solução para isso

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

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

1

Para matriz de cadeias de caracteres para cadeia separada por vírgula

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

1

você pode experimentar o seguinte trecho

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.