¿Manera fácil de convertir la matriz de JavaScript en una lista separada por comas?


403

Tengo una matriz unidimensional de cadenas en JavaScript que me gustaría convertir en una lista separada por comas. ¿Hay una manera simple en JavaScript de variedad de jardín (o jQuery) para convertir eso en una lista separada por comas? (Sé cómo iterar a través de la matriz y construir la cadena yo mismo por concatenación si esa es la única forma).


2
toString () : si está buscando la forma más sencilla, es mejor usar toString () de esta manera: var arr = ["Zero", "One", "Two"]; console.log(arr.toString());que devuelve Zero,One,Two Leer más
Mohammad Musavi

Respuestas:


784

El método Array.prototype.join () :

var arr = ["Zero", "One", "Two"];

document.write(arr.join(", "));


2
@ Mark: es cierto, pero necesito concatenar la lista de ID, sin posibilidad de comas u otros caracteres especiales
davewilliams459

11
@ davewilliams459: ¿Pero no eres el OP? Op dijo "una matriz unidimensional de cadenas". Instrumentos de cuerda. No identificaciones. Eso implica que podrían ser cualquier cosa. Lo que significa que pueden contener otras comas.
mpen

22
@ Mark: La respuesta es correcta para la pregunta que se le hizo. Cualquier otro requisito se deja al individuo para que lo resuelva por sí mismo. OP solicitó una lista separada por comas, no un formato tipo CSV citado.
Wayne

10
@Wayne: sigo pensando que es necesario hacer una advertencia :) La gente no siempre piensa en estas cosas y luego se disparan en el pie más tarde.
mpen

13
@Mark: su comentario es perfectamente válido (como otros han indicado con un voto a favor), pero ¿podría haber sido más útil proporcionar la respuesta alternativa con un código de ejemplo?
Chris

94

En realidad, la toString()implementación se une con comas por defecto:

var arr = [ 42, 55 ];
var str1 = arr.toString(); // Gives you "42,55"
var str2 = String(arr); // Ditto

No sé si esto es obligatorio por la especificación JS pero esto es lo que más prácticamente todos los navegadores parecen estar funcionando.


1
También está el más corto (pero menos claro)arr + ''
Oriol

array.toString hace el trabajo sin espacio después de la coma. Con array.join eres flexible.
jMike

3
rendimiento toString()y join(",")es aproximadamente equivalente a partir de abril de 2018
MattMcKnight

29

O (más eficientemente):

var arr = nueva matriz (3);
arr [0] = "Cero";
arr [1] = "Uno";
arr [2] = "Dos";

document.write (arr); // igual que document.write (arr.toString ()) en este contexto

El método toString de una matriz cuando se llama devuelve exactamente lo que necesita: una lista separada por comas.


2
En la mayoría de los casos, toString es realmente más lento que la combinación de matrices. Mira aquí: jsperf.com/tostring-join
Sameer Alibhai

13

Aquí hay una implementación que convierte una matriz bidimensional o una matriz de columnas en una cadena CSV con escape adecuado. Las funciones no comprueban la entrada de cadenas / números válidos ni los recuentos de columnas (para empezar, asegúrese de que su matriz sea válida). ¡Las celdas pueden contener comas y comillas!

Aquí hay un script para decodificar cadenas CSV .

Aquí está mi script para codificar cadenas CSV :

// Example
var csv = new csvWriter();
csv.del = '\t';
csv.enc = "'";

var nullVar;
var testStr = "The comma (,) pipe (|) single quote (') double quote (\") and tab (\t) are commonly used to tabulate data in plain-text formats.";
var testArr = [
    false,
    0,
    nullVar,
    // undefinedVar,
    '',
    {key:'value'},
];

console.log(csv.escapeCol(testStr));
console.log(csv.arrayToRow(testArr));
console.log(csv.arrayToCSV([testArr, testArr, testArr]));

/**
 * Class for creating csv strings
 * Handles multiple data types
 * Objects are cast to Strings
 **/

function csvWriter(del, enc) {
    this.del = del || ','; // CSV Delimiter
    this.enc = enc || '"'; // CSV Enclosure

    // Convert Object to CSV column
    this.escapeCol = function (col) {
        if(isNaN(col)) {
            // is not boolean or numeric
            if (!col) {
                // is null or undefined
                col = '';
            } else {
                // is string or object
                col = String(col);
                if (col.length > 0) {
                    // use regex to test for del, enc, \r or \n
                    // if(new RegExp( '[' + this.del + this.enc + '\r\n]' ).test(col)) {

                    // escape inline enclosure
                    col = col.split( this.enc ).join( this.enc + this.enc );

                    // wrap with enclosure
                    col = this.enc + col + this.enc;
                }
            }
        }
        return col;
    };

    // Convert an Array of columns into an escaped CSV row
    this.arrayToRow = function (arr) {
        var arr2 = arr.slice(0);

        var i, ii = arr2.length;
        for(i = 0; i < ii; i++) {
            arr2[i] = this.escapeCol(arr2[i]);
        }
        return arr2.join(this.del);
    };

    // Convert a two-dimensional Array into an escaped multi-row CSV 
    this.arrayToCSV = function (arr) {
        var arr2 = arr.slice(0);

        var i, ii = arr2.length;
        for(i = 0; i < ii; i++) {
            arr2[i] = this.arrayToRow(arr2[i]);
        }
        return arr2.join("\r\n");
    };
}

11

Creo que esto debería hacerlo:

var arr = ['contains,comma', 3.14, 'contains"quote', "more'quotes"]
var item, i;
var line = [];

for (i = 0; i < arr.length; ++i) {
    item = arr[i];
    if (item.indexOf && (item.indexOf(',') !== -1 || item.indexOf('"') !== -1)) {
        item = '"' + item.replace(/"/g, '""') + '"';
    }
    line.push(item);
}

document.getElementById('out').innerHTML = line.join(',');

violín

Básicamente, todo lo que hace es verificar si la cadena contiene una coma o una cita. Si lo hace, duplica todas las comillas y pone comillas en los extremos. Luego une cada una de las partes con una coma.


2
Noooooooooo! Tentado a rechazarlo. ¿Qué pasa si las comillas se deben escapar con barras invertidas? Necesitan ser variables. ;)
Joshua Burns el

1
@JoshuaBurns wikipedia dice que las comillas dobles se deben escapar con otra cita, pero no hay un estándar formal. Si su lector CSV requiere algo diferente, siéntase libre de modificar y / o
votar a favor

55
En realidad, hay un RFC, tools.ietf.org/rfc/rfc4180.txt , y eso es correcto, las comillas dobles se deben escapar con comillas dobles.
Steve Buzonas

2
@SteveBuzonas, acabas de acusar a ese tipo con tu RFC.
devinbost

9

Si necesita usar "y" en lugar de "," entre los dos últimos elementos, puede hacer esto:

function arrayToList(array){
  return array
    .join(", ")
    .replace(/, ((?:.(?!, ))+)$/, ' and $1');
}

9

Hay muchos métodos para convertir una matriz en una lista separada por comas

1. Usando array # join

De MDN

El método join () une todos los elementos de una matriz (o un objeto tipo matriz) en una cadena.

El código

var arr = ["this","is","a","comma","separated","list"];
arr = arr.join(",");

Retazo

2. Usando array # toString

De MDN

El método toString () devuelve una cadena que representa la matriz especificada y sus elementos.

El código

var arr = ["this","is","a","comma","separated","list"];
arr = arr.toString();

Retazo

3. Agregue [] + antes de la matriz o + [] después de una matriz

El [] + o + [] convertirá en una cadena

Prueba

([]+[] === [].toString())

dará salida verdadero

var arr = ["this","is","a","comma","separated","list"];
arr = []+arr;

Retazo

también

var arr = ["this","is","a","comma","separated","list"];
arr = arr+[];



3

Por lo general, necesito algo que también omita el valor si ese valor es nullo undefined, etc.

Así que aquí está la solución que funciona para mí:

// Example 1
const arr1 = ['apple', null, 'banana', '', undefined, 'pear'];
const commaSeparated1 = arr1.filter(item => item).join(', ');
console.log(commaSeparated1); // 'apple, banana, pear'

// Example 2
const arr2 = [null, 'apple'];
const commaSeparated2 = arr2.filter(item => item).join(', ');
console.log(commaSeparated2); // 'apple'

La mayoría de las soluciones aquí regresarían ', apple'si mi matriz se pareciera a la de mi segundo ejemplo. Por eso prefiero esta solución.


2

Me gustó la solución en https://jsfiddle.net/rwone/qJUh2/ porque agrega espacios después de las comas:

array = ["test","test2","test3"]
array = array.toString();
array = array.replace(/,/g, ", ");
alert(array);

O, como lo sugiere @StackOverflaw en los comentarios:

array.join(', ');

1
en una llamada: arr.join(', ')que en realidad es más rápido (según los comentarios de @Sameer) y también más seguro (no se mete con comas dentro de los valores de la matriz como lo haría RegExp en la cadena resultante). ;)
Stock Overflaw

@StockOverflaw Way mejor. Menos código para hacer lo mismo, más seguro y más rápido. Gracias.
Jaime Montoya

2

Papa Parse maneja comas en valores y otros casos extremos.

( Baby Parse for Node ha quedado en desuso; ahora puede usar Papa Parse en el navegador y en Node).

P.ej. (nodo)

const csvParser = require('papaparse'); // previously you might have used babyparse
var arr = [1,null,"a,b"] ;
var csv = csvParser.unparse([arr]) ;
console.log(csv) ;

1 ,, "a, b"


1

Tomando el código inicial:

var arr = new Array(3);
arr[0] = "Zero";
arr[1] = "One";
arr[2] = "Two";

La respuesta inicial de usar la función de combinación es ideal. Una cosa a considerar sería el uso final de la cadena.

Para usar en alguna pantalla de texto final:

arr.join(",")
=> "Zero,One,Two"

Para usar en una URL para pasar múltiples valores de una manera (algo) RESTful:

arr.join("|")
=> "Zero|One|Two"

var url = 'http://www.yoursitehere.com/do/something/to/' + arr.join("|");
=> "http://www.yoursitehere.com/do/something/to/Zero|One|Two"

Por supuesto, todo depende del uso final. Solo tenga en cuenta la fuente y el uso de datos y todo estará bien con el mundo.


1

¿Quieres terminar con un "y"?

Para esta situación, creé un módulo npm.

Prueba arrford :


Uso

const arrford = require('arrford');

arrford(['run', 'climb', 'jump!']);
//=> 'run, climb, and jump!'

arrford(['run', 'climb', 'jump!'], false);
//=> 'run, climb and jump!'

arrford(['run', 'climb!']);
//=> 'run and climb!'

arrford(['run!']);
//=> 'run!'


Instalar en pc

npm install --save arrford


Lee mas

https://github.com/dawsonbotsford/arrford


Inténtalo tú mismo

Enlace tónico


1

A partir de Chrome 72 , es posible usar Intl.ListFormat :

const vehicles = ['Motorcycle', 'Bus', 'Car'];

const formatter = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
console.log(formatter.format(vehicles));
// expected output: "Motorcycle, Bus, and Car"

const formatter2 = new Intl.ListFormat('de', { style: 'short', type: 'disjunction' });
console.log(formatter2.format(vehicles));
// expected output: "Motorcycle, Bus oder Car"

const formatter3 = new Intl.ListFormat('en', { style: 'narrow', type: 'unit' });
console.log(formatter3.format(vehicles));
// expected output: "Motorcycle Bus Car"

Tenga en cuenta que esta forma está en su etapa más temprana, por lo que a partir de la fecha de publicación de esta respuesta, espere incompatibilidad con versiones anteriores de Chrome y otros navegadores.


0
var arr = ["Pro1", "Pro2", "Pro3"];
console.log(arr.join());// Pro1,Pro2,Pro3
console.log(arr.join(', '));// Pro1, Pro2, Pro3

0
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s); // => Zero,One,Two

1
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. Por favor, trate de no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones!
kayess 01 de

0

Esta solución también elimina valores como " ":

const result = ['', null, 'foo', '  ', undefined, 'bar'].filter(el => {
  return Boolean(el) && el.trim() !== '';
}).join(', ');

console.log(result); // => foo, bar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.