¿Cómo convertir una cadena separada por comas en una matriz?

720

Tengo una cadena separada por comas que quiero convertir en una matriz, para poder recorrerla.

¿Hay algo incorporado para hacer esto?

Por ejemplo, tengo esta cadena

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

ahora quiero dividir esto por la coma, y ​​luego almacenarlo en una matriz.

Blankman
fuente
77
Solo quería comentar que esto no requiere jquery, esto es parte del javascript mismo.
Chris
44
Con respecto al duplicado: esto precede a la pregunta referenciada en 18 meses. En todo caso, el otro no solo es un engañado, sino que ofrece una solución extremadamente complicada para un problema muy simple debido al requisito de
expresiones
40
Fácil. string.split(',');
Braden Best
44
No estoy seguro de por qué esto está marcado como "demasiado localizado". La división de cadenas surge mucho , y generalmente es aplicable a la audiencia mundial de Internet (como lo demuestra el hecho de que mi respuesta todavía recibe votos de alguna manera regularmente). Dudo que otras 4 personas vengan y lo vuelvan a abrir, pero aún así. Extraño.
Matchu

Respuestas:

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

Referencia de MDN , principalmente útil para el posible comportamiento inesperado del limitparámetro. (Sugerencia: "a,b,c".split(",", 2)sale ["a", "b"], no ["a", "b,c"].)

Matchu
fuente
3
Corto y dulce, es agradable ver que JavaScript stringtiene la riqueza de Java String.
Michael Shops en
Las mejores prácticas para admitir todo tipo de cadenas. Ver aquí stackoverflow.com/a/32657055/2632619
Andi AR
66
Si splitbien funcionará bien si está seguro de que tiene elementos array, si espera datos de un servidor / base de datos, se encontrará con problemas ya que ''.split(',')tiene un length === 1IE:''.split(',') === ['']
oportocala
@MichaelShopsin and All, la función de división no funciona con IE11 como dice No se puede obtener la propiedad 'Split' de referencia indefinida o nula.
DLV
@DLV que suena como una nueva pregunta, tal vez debería preguntar después de revisar las preguntas de IE que ya están en StackOverflow.
Michael Shopsin
130

Tenga cuidado si apunta a números enteros, como 1,2,3,4,5. Si tiene la intención de usar los elementos de su matriz como enteros y no como cadenas después de dividir la cadena, considere convertirlos en tales.

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

agregando un bucle como este

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

devolverá una matriz que contiene enteros y no cadenas.

popular
fuente
47
Tenga en cuenta que parseInt () intenta adivinar la base a menos que la establezca explícitamente, lo que puede causar resultados inesperados al tratar con ceros a la izquierda ( "001,002,003..."). Comparar parseInt('010')con parseInt('010', 10).
Álvaro González
3
Votaría más el comentario de Alvaro si pudiera. Aprendí esa lección hace un tiempo y nunca la he olvidado.
Antony Scott
2
+1 Este ejemplo es más claro y demuestra que la cadena no es un objeto estático, sino la variable que es la cadena.
K0D4
55
La mapfunción se puede usar para realizar el análisis de enteros en una línea:str.split(',').map(parseInt)
Jud
1
Esta no es la solución más eficiente. Según mis experimentos con Chrome 49. JSON.parse ('[' + str + ']') es un 40% más rápido que esta solución.
Yao
33

Hmm split es peligroso en mi humilde opinión, ya que una cadena siempre puede contener una coma, observe lo siguiente:

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

Entonces, ¿cómo interpelarías eso? y que quieres que sea el resultado? una matriz con:

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

incluso si escapas de la coma tendrías un problema.

Rápidamente tocó esto juntos:

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

Siéntase libre de usarlo / editarlo :)

Solo yo
fuente
1
Esto funciona muy bien con los números también y no tenemos que ejecutar un ciclo parseInt separado para ellos como se menciona en otra respuesta a continuación. Este es un pensamiento realmente profundo. ¡Lo aprecio mucho y creo que la mejor respuesta entre todas!
Anmol Saraf
28

El método split () se usa para dividir una cadena en una matriz de subcadenas y devuelve la nueva matriz.

var array = string.split(',');
Jakkwylde
fuente
¿Cuál sería el resultado? por ejemplo si tengo var a = "hola, mundo, bebé"; y var array = a.split (','); -> mi matriz se vería así: matriz = ["hola", "mundo", "bebé"]; ??
Desarrollador fundamental el
1
Si, eso es correcto. La matriz resultante sería tal como lo mencionas.
Jakkwylde
Su respuesta está funcionando para mí, pero mi nueva matriz no está reemplazando a la anterior. ¿Me puedes ayudar? var sampleTags = ['[email protected]']; 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

Tenga en cuenta que lo siguiente:

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

alertará 1

usuario1386213
fuente
14

Pase su cadena separada por comas en esta función y devolverá una matriz, y si no se encuentra una cadena separada por comas, devolverá 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 ;
    }
BJ Patel
fuente
3
En lugar de solo publicar un bloque de código, explique por qué este código resuelve el problema planteado. Sin una explicación, esto no es una respuesta.
Martijn Pieters
1
Esta es la solución más correcta si no está seguro de que la cadena contendrá su valor dividido. Esta función evitará que el método de división produzca errores si la cadena no tiene una coma (dado el ejemplo anterior).
CoryDorning
1
Nota: las funciones que comienzan con mayúscula están, la mayoría de las veces, diseñadas para ser invocadas. es mejor usar letras minúsculas en funciones que no están diseñadas para ser invocadas.
Jsterman
Esto falló para mí cuando solo tenía un valor sin comas. Agregado else { ResultArray = [CommaSepStr]; }después del segundoif
Thomas Byy
Gracias han agregado. eso.
BJ Patel
8

Función de retorno

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

acepta cadenas y 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/

Andi AR
fuente
3
las cadenas de texto tienen errores - SyntaxError: las cadenas de números de identificadores inesperados están bien. p.ej. var stringtext = "String, text, I, am"; var stringtextArray = (new Function("return [" + string text + "];")()); el resultado es: SyntaxError: Identificador inesperado
nycdanie
7

Sé que esta pregunta ha sido respondida durante bastante tiempo, pero pensé que mi contribución sería beneficiosa para otras personas que investigan este tema ...

Aquí hay una función que convertirá una cadena en una matriz, incluso si solo hay un elemento en la lista (sin carácter 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;
}

Úselo así:

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

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

Creé esta función porque splitarroja un error si no hay un carácter separador en la cadena (solo un elemento)

Kabb5
fuente
3
No se produce ningún error si no se encuentra el separador: 'echo'.split(',')devuelve ['echo']y ''.split(',') devuelve ['']. Usted va a obtener un error si se llama x.split(',')cuando xno es una cadena (incluso cuando xestá sin definir o nula ), porque no hay una splitfunción disponible para otros tipos.
Joel Lee
Ah, veo que en realidad estaba tratando de usar splitun objeto indefinido cuando escribí mi función listToArray. Gracias por señalar eso ...
Kabb5
6

Tuve un problema similar, pero más complejo ya que necesitaba transformar un csv en una matriz de matrices (cada línea es un elemento de matriz que en su interior tiene una matriz de elementos divididos por comas).

La solución más fácil (y más segura, apuesto) fue usar PapaParse ( http://papaparse.com/ ) que tiene una opción "sin encabezado" que transforma el csv en una matriz de matrices, además, detecta automáticamente el " "como mi delimitador.

Además, está registrado en Bower, por lo que solo tuve que:

bower install papa-parse --save

y luego usarlo en mi código de la siguiente manera:

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

Realmente me gustó.

Diego Pamio
fuente
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"]

y si quieres convertir lo siguiente a:

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

esta:

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

utilizar:

str = arr.join(',')
Mubeen Khan
fuente
3

buena solución para eso

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

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

Para una matriz de cadenas a cadenas separadas por comas

let months = ["January","Feb"];
let monthsString = months.join(", ");
Srikanth Gowda
fuente
1

puedes probar el siguiente fragmento

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

Más corto

str.split`,`

Kamil Kiełczewski
fuente