web-dev-qa-db-fra.com

Un moyen facile de transformer un tableau JavaScript en liste séparée par des virgules?

J'ai un tableau unidimensionnel de chaînes en JavaScript que j'aimerais transformer en une liste séparée par des virgules. Existe-t-il un moyen simple dans JavaScript de jardinage (ou jQuery) de le transformer en une liste séparée par des virgules? (Je sais comment parcourir le tableau et construire la chaîne moi-même par concaténation si c'est le seul moyen.)

353
Herb Caudill

La méthode Array.prototype.join () :

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

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

684
Wayne

En fait, l'implémentation toString() effectue une jointure avec des virgules par défaut:

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

Je ne sais pas si cela est mandaté par la spécification JS mais c'est ce que plus à peu près tous les navigateurs semblent faire.

83
Ates Goral

Ou (plus efficacement):

 var arr = new Tableau (3); 
 arr [0] = "Zero"; 
 arr [1] = "Un"; 
 arr [2] = "Deux"; 

 document.write (arr); // identique à document.write (arr.toString ()) dans ce contexte 

La méthode toString d'un tableau lorsqu'elle est appelée renvoie exactement ce dont vous avez besoin - une liste séparée par des virgules.

29
Sergey Ilinsky

Voici une implémentation qui convertit un tableau à deux dimensions ou un tableau de colonnes en une chaîne CSV correctement échappée. Les fonctions ne vérifient pas les entrées de chaîne/nombre valides ni le nombre de colonnes (assurez-vous que votre tableau est valide pour commencer) Les cellules peuvent contenir des virgules et des virgules! 

Voici un script pour décoder les chaînes CSV .

Voici mon script pour l'encodage de chaînes 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");
    };
}
13
skibulk

Je pense que cela devrait le faire:

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

violon

Fondamentalement, tout ce qu'il fait est de vérifier si la chaîne contient une virgule ou une citation. Si c'est le cas, toutes les citations sont doublées et placées entre elles. Ensuite, il joint chaque partie avec une virgule.

10
mpen

Utilisez la méthode Array.toString intégrée 

var arr = ['one', 'two', 'three'];
arr.toString();  // 'one,two,three'

MDN sur Array.toString ()

7
Avijit Gupta

Si vous devez utiliser "et" au lieu de "," vous pouvez le faire:

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

Je trouve généralement que j'ai besoin de quelque chose qui ignore également la valeur si cette valeur est null ou undefined, etc.

Alors voici la solution qui fonctionne pour moi:

// 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 plupart des solutions ici renverraient ', Apple' si mon tableau ressemblait à celui de mon deuxième exemple. C'est pourquoi je préfère cette solution.

3
knowbody

Voulez-vous terminer avec un "et"?

Pour cette situation, j'ai créé un module npm.

Essayez arrford :


Usage

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!'


Installer

npm install --save arrford


Lire la suite

https://github.com/dawsonbotsford/arrford


Essayez vous-même

Lien tonique

1
Dawson Botsford

Prenant le code initial:

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

La réponse initiale à l’utilisation de la fonction join est idéale. Une chose à considérer serait l'utilisation ultime de la chaîne. 

Pour utiliser un affichage textuel final:

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

Pour utiliser dans une URL pour transmettre plusieurs valeurs de manière (quelque peu) 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"

Bien sûr, tout dépend de l'utilisation finale. Il suffit de garder la source de données et son utilisation en tête et tout ira bien avec le monde.

1
E Roberts

Papa Parse (basé sur le navigateur) gère les virgules dans les valeurs et autres cas Edge . Utilisez Baby Parse pour Node.

Par exemple. (nœud)

const csvParser = require('babyparse');
var arr = [1,null,"a,b"] ;
var csv = csvParser.unparse([arr]) ;
console.log(csv) ;

1 , "a, b"

1
Bob

A partir de Chrome 72 , il est possible d'utiliser 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"

Notez que cette méthode en est à ses débuts. Par conséquent, à compter de la date d'envoi de cette réponse, attendez-vous à une incompatibilité avec les anciennes versions de Chrome et d'autres navigateurs.

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

J'ai aimé la solution sur https://jsfiddle.net/rwone/qJUh2/ car elle ajoute des espaces après les virgules:

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

Ou, comme suggéré par @StackOverflaw dans les commentaires:

array.join(', ');
0
Jaime Montoya

Cette solution supprime également les valeurs telles que " ":

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

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