Un modo semplice per trasformare l'array JavaScript in un elenco separato da virgole?


403

Ho una matrice unidimensionale di stringhe in JavaScript che vorrei trasformare in un elenco separato da virgole. Esiste un modo semplice in JavaScript (o jQuery) di varietà da giardino per trasformarlo in un elenco separato da virgole? (So ​​iterare attraverso l'array e costruire la stringa da solo concatenando se è l'unico modo.)


2
toString () : se stai cercando il modo più semplice è meglio usare toString () in questo modo: var arr = ["Zero", "One", "Two"]; console.log(arr.toString());che restituisce Zero,One,Two Per saperne di più
Mohammad Musavi,

Risposte:


784

Il metodo Array.prototype.join () :

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

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


2
@Mark: abbastanza vero ma ho bisogno di concatenare un elenco di ID, nessuna possibilità di virgole o altri caratteri speciali
davewilliams459

11
@ davewilliams459: Ma tu non sei l'OP? Op ha detto "una matrice unidimensionale di stringhe". Stringhe. Non ID. Ciò implica che potrebbero essere qualsiasi cosa. Ciò significa che possono contenere altre virgole.
Aprire l'

22
@Mark: la risposta è corretta per la domanda come posta. Eventuali altri requisiti sono lasciati all'individuo per allenarsi da soli. OP ha chiesto un elenco separato da virgole, non un formato di tipo CSV citato.
Wayne,

10
@Wayne: penso ancora che un avvertimento sia in ordine :) Le persone non sempre riflettono su queste cose e poi si sparano ai piedi più tardi.
Aprire il

13
@Mark - il tuo commento è perfettamente valido (come altri hanno indicato con un voto) ma potrebbe essere più utile fornire effettivamente la risposta alternativa con un codice di esempio?
Chris,

94

In realtà, l' toString()implementazione fa un join con le virgole per impostazione predefinita:

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

Non so se questo è richiesto dalle specifiche JS ma questo è cosa maggior parte praticamente tutti i browser sembrano fare.


1
C'è anche il più breve (ma meno chiaro)arr + ''
Oriol

array.toString fa il lavoro senza spazio dopo la virgola. Con array.join sei flessibile.
jMike,

3
le prestazioni di toString()e join(",")sono approssimativamente equivalenti a partire da aprile 2018
MattMcKnight

29

O (in modo più efficiente):

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

document.write (arr); // uguale a document.write (arr.toString ()) in questo contesto

Il metodo toString di un array quando chiamato restituisce esattamente ciò di cui hai bisogno: un elenco separato da virgole.


2
Nella maggior parte dei casi, toString è in realtà più lento del join dell'array. Cerca
Sameer Alibhai,

13

Ecco un'implementazione che converte un array bidimensionale o un array di colonne in una stringa CSV con escape corretto. Le funzioni non controllano l'immissione di stringhe / numeri o conteggi di colonne validi (assicurarsi che l'array sia valido per cominciare). Le celle possono contenere virgole e virgolette!

Ecco uno script per la decodifica delle stringhe CSV .

Ecco il mio script per la codifica delle stringhe 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

Penso che questo dovrebbe farlo:

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

violino

Fondamentalmente tutto ciò che fa è verificare se la stringa contiene una virgola o una virgoletta. In tal caso, raddoppia tutte le virgolette e mette le virgolette alle estremità. Quindi unisce ciascuna delle parti con una virgola.


2
Noooooooooo! Tentato di votare. E se le virgolette dovessero essere salvate con le barre rovesciate ?! Devono essere variabili. ;)
Joshua Burns,

1
@JoshuaBurns wikipedia afferma che le doppie virgolette dovrebbero essere sfuggite a un'altra, ma non esiste uno standard formale. Se il tuo lettore CSV richiede qualcosa di diverso, sentiti libero di modificare e / o sottovalutare;)
mpen

5
In realtà esiste un RFC, tools.ietf.org/rfc/rfc4180.txt , e questo è il caso che le doppie virgolette siano corrette con doppie virgolette.
Steve Buzonas,

2
@SteveBuzonas, hai appena lanciato quel tipo con il tuo RFC.
Devinbost,

9

Se devi usare "e" invece di "," tra gli ultimi due elementi puoi farlo:

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

9

Esistono molti metodi per convertire un array in un elenco separato da virgole

1. Utilizzo dell'array # join

Da MDN

Il metodo join () unisce tutti gli elementi di una matrice (o un oggetto simile a una matrice) in una stringa.

Il codice

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

Frammento

2. Utilizzo dell'array # toString

Da MDN

Il metodo toString () restituisce una stringa che rappresenta l'array specificato e i suoi elementi.

Il codice

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

Frammento

3. Aggiungi [] + prima di un array o + [] dopo un array

Il [] + o + [] lo convertirà in una stringa

Prova

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

produrrà vero

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

Frammento

Anche

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



3

Di solito mi ritrovo a aver bisogno di qualcosa che salta anche il valore se quel valore è nullo undefined, ecc.

Quindi ecco la soluzione che funziona per me:

// 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 maggior parte delle soluzioni qui tornerebbe ', apple'se il mio array assomigli a quello del mio secondo esempio. Ecco perché preferisco questa soluzione.


2

Mi è piaciuta la soluzione su https://jsfiddle.net/rwone/qJUh2/ perché aggiunge spazi dopo le virgole:

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

Oppure, come suggerito da @StackOverflaw nei commenti:

array.join(', ');

1
in una chiamata: arr.join(', ')che è in realtà più veloce (secondo i commenti di @Sameer) e anche più sicuro (non si scherza con le virgole all'interno dei valori dell'array come RegExp sulla stringa risultante). ;)
Stock Overflaw,

@StockOverflaw Molto meglio. Meno codice per fare la stessa cosa, più sicuro e veloce. Grazie.
Jaime Montoya,

2

Papa Parse gestisce le virgole in valori e altri casi limite.

( Baby Parse for Node è stato deprecato: ora puoi utilizzare Papa Parse nel browser e in Node.)

Per esempio. (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

Prendendo il codice iniziale:

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

La risposta iniziale dell'utilizzo della funzione join è l'ideale. Una cosa da considerare sarebbe l'uso finale della stringa.

Per l'utilizzo in alcuni display testuali finali:

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

Per l'utilizzo in un URL per il passaggio di più valori in un modo (in qualche modo) 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"

Certo, tutto dipende dall'uso finale. Tieni solo a mente la fonte di dati e utilizzali e tutto andrà bene per il mondo.


1

Vuoi terminarlo con un "e"?

Per questa situazione, ho creato un modulo npm.

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


Installare

npm install --save arrford


Leggi di più

https://github.com/dawsonbotsford/arrford


Prova tu stesso

Collegamento tonico


1

A partire da Chrome 72 , è possibile utilizzare 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"

Tieni presente che questo modo è nella sua fase molto precedente, quindi a partire dalla data di pubblicazione di questa risposta, aspettati incompatibilità con le versioni precedenti di Chrome e altri browser.


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
Mentre questo frammento di codice può risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non aggiungere il tuo codice a commenti esplicativi, ciò riduce la leggibilità sia del codice che delle spiegazioni!
kayess,

0

Questa soluzione rimuove anche valori come " ":

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

console.log(result); // => foo, bar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.