Einfache Möglichkeit, JavaScript-Array in eine durch Kommas getrennte Liste umzuwandeln?

403

Ich habe ein eindimensionales Array von Zeichenfolgen in JavaScript, das ich in eine durch Kommas getrennte Liste umwandeln möchte. Gibt es eine einfache Möglichkeit in JavaScript (oder jQuery) für Gartenvarianten, dies in eine durch Kommas getrennte Liste umzuwandeln? (Ich weiß, wie man das Array durchläuft und den String selbst durch Verkettung erstellt, wenn dies der einzige Weg ist.)

Herb Caudill
quelle
2
toString () : Wenn Sie nach dem einfachsten Weg suchen, ist es besser, toString () wie folgt zu verwenden : var arr = ["Zero", "One", "Two"]; console.log(arr.toString());das gibt Zero,One,Two Read more
Mohammad Musavi

Antworten:

784

Die Array.prototype.join () -Methode:

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

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

Wayne
quelle
2
@ Mark: wahr genug, aber ich muss Liste der IDs verketten, keine Chance auf Kommas oder andere Sonderzeichen
davewilliams459
11
@ davewilliams459: Aber du bist nicht der OP? Op sagte "eine eindimensionale Anordnung von Zeichenfolgen". Saiten. Keine IDs. Das bedeutet, dass sie alles sein könnten. Das heißt, sie können andere Kommas enthalten.
Mpen
22
@ Mark: Die Antwort ist korrekt für die gestellte Frage. Alle anderen Anforderungen bleiben dem Einzelnen überlassen, um selbst zu arbeiten. OP fragte nach einer durch Kommas getrennten Liste, nicht nach einem CSV-Format in Anführungszeichen.
Wayne
10
@ Wayne: Ich denke immer noch, dass eine Warnung angebracht ist :) Die Leute denken nicht immer über diese Dinge nach und schießen sich später in den Fuß.
Mpen
13
@Mark - Ihr Kommentar ist vollkommen gültig (wie andere mit einer positiven Bewertung angegeben haben), aber hilfreicher könnte es gewesen sein, die alternative Antwort tatsächlich mit Beispielcode bereitzustellen?
Chris
94

Tatsächlich führt die toString()Implementierung standardmäßig einen Join mit Kommas durch:

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

Ich weiß nicht, ob dies von der JS-Spezifikation vorgeschrieben wird, aber das ist was die meisten So ziemlich alle Browser scheinen dies zu tun.

Ates Goral
quelle
1
Es gibt auch die kürzere (aber weniger klare)arr + ''
Oriol
array.toString erledigt den Job ohne Leerzeichen nach dem Komma. Mit array.join sind Sie flexibel.
jMike
3
Leistung von toString()und join(",")ist ungefähr gleichwertig ab April 2018
MattMcKnight
29

Oder (effizienter):

var arr = neues Array (3);
arr [0] = "Null";
arr [1] = "Eins";
arr [2] = "Zwei";

document.write (arr); // wie document.write (arr.toString ()) in diesem Zusammenhang

Die toString-Methode eines Arrays gibt beim Aufruf genau das zurück, was Sie benötigen - eine durch Kommas getrennte Liste.

Sergey Ilinsky
quelle
2
In den meisten Fällen ist toString tatsächlich langsamer als der Array-Join. Lookie hier: jsperf.com/tostring-join
Sameer Alibhai
13

Hier ist eine Implementierung, die ein zweidimensionales Array oder ein Array von Spalten in eine ordnungsgemäß maskierte CSV-Zeichenfolge konvertiert. Die Funktionen prüfen nicht, ob gültige Zeichenfolgen- / Zahleneingaben oder Spaltenzahlen vorhanden sind (stellen Sie sicher, dass Ihr Array zunächst gültig ist). Die Zellen können Kommas und Anführungszeichen enthalten!

Hier ist ein Skript zum Dekodieren von CSV-Zeichenfolgen .

Hier ist mein Skript zum Codieren von CSV-Zeichenfolgen :

// 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");
    };
}
Skibulk
quelle
11

Ich denke, das sollte es tun:

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

Geige

Grundsätzlich wird nur geprüft, ob die Zeichenfolge ein Komma oder ein Anführungszeichen enthält. Wenn dies der Fall ist, werden alle Anführungszeichen verdoppelt und Anführungszeichen an den Enden gesetzt. Dann verbindet es jeden der Teile mit einem Komma.

mpen
quelle
2
Noooooooooo! Versuchung, abzustimmen. Was ist, wenn die Anführungszeichen mit Backslashes maskiert werden sollen?! Sie müssen variabel sein. ;)
Joshua Burns
1
@JoshuaBurns Wikipedia sagt, dass doppelte Anführungszeichen mit einem anderen Anführungszeichen maskiert werden sollten, aber es gibt keinen formalen Standard. Wenn Ihr CSV-Reader etwas anderes benötigt, können Sie ihn gerne ändern und / oder ablehnen;)
mpen
5
Tatsächlich gibt es einen RFC, tools.ietf.org/rfc/rfc4180.txt , und das ist richtig, doppelte Anführungszeichen sollten mit doppelten Anführungszeichen maskiert werden.
Steve Buzonas
2
@SteveBuzonas, du hast diesen Kerl gerade mit deinem RFC gepwnnt.
Devinbost
9

Wenn Sie zwischen den letzten beiden Elementen "und" anstelle von "verwenden müssen, können Sie Folgendes tun:

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

Es gibt viele Methoden, um ein Array in eine durch Kommas getrennte Liste zu konvertieren

1. Verwenden von Array # Join

Von MDN

Die Methode join () fasst alle Elemente eines Arrays (oder eines Array-ähnlichen Objekts) zu einer Zeichenfolge zusammen.

Der Code

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

Snippet

2. Verwenden von Array # toString

Von MDN

Die toString () -Methode gibt eine Zeichenfolge zurück, die das angegebene Array und seine Elemente darstellt.

Der Code

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

Snippet

3. Fügen Sie [] + vor dem Array oder + [] nach einem Array hinzu

Das [] + oder + [] konvertiert es in eine Zeichenfolge

Beweis

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

wird true ausgeben

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

Snippet

Ebenfalls

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

Sagar V.
quelle
8

Verwenden Sie die integrierte Array.toStringMethode

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

MDN auf Array.toString ()

Avijit Gupta
quelle
3

Normalerweise brauche ich etwas, das den Wert auch überspringt, wenn dieser Wert nulloder undefinedusw. ist.

Hier ist die Lösung, die für mich funktioniert:

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

Die meisten Lösungen hier würden zurückkehren, ', apple'wenn mein Array wie in meinem zweiten Beispiel aussehen würde. Deshalb bevorzuge ich diese Lösung.

Knowbody
quelle
2

Ich mochte die Lösung unter https://jsfiddle.net/rwone/qJUh2/, weil sie Leerzeichen nach Kommas hinzufügt:

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

Oder, wie von @StackOverflaw in den Kommentaren vorgeschlagen:

array.join(', ');
Jaime Montoya
quelle
1
in einem Aufruf : arr.join(', '), der tatsächlich schneller (laut @ Sameer-Kommentaren) und auch sicherer ist (nicht mit Kommas innerhalb von Array-Werten herumwirbelt, wie dies bei RegExp für die resultierende Zeichenfolge der Fall wäre). ;)
Stock Overflaw
@ StockOverflaw Viel besser. Weniger Code, um dasselbe zu tun, sicherer und schneller. Vielen Dank.
Jaime Montoya
2

Papa Parse behandelt Kommas in Werten und anderen Randfällen.

( Baby Parse for Node ist veraltet - Sie können Papa Parse jetzt im Browser und im Node verwenden.)

Z.B. (Knoten)

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"

Bob
quelle
1

Nehmen Sie den Anfangscode:

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

Die erste Antwort auf die Verwendung der Join-Funktion ist ideal. Eine zu berücksichtigende Sache wäre die endgültige Verwendung der Zeichenfolge.

Für die Verwendung in einigen Endtextanzeigen:

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

Für die Verwendung in einer URL zur (mehr) REST-fähigen Weitergabe mehrerer Werte:

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"

Natürlich hängt alles von der endgültigen Verwendung ab. Behalten Sie einfach die Datenquelle und die Verwendung im Auge und alles wird mit der Welt in Ordnung sein.

E Roberts
quelle
1

Möchten Sie es mit einem "und" beenden?

Für diese Situation habe ich ein npm-Modul erstellt.

Versuchen Sie es mit arrford :


Verwendungszweck

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


Installieren

npm install --save arrford


Weiterlesen

https://github.com/dawsonbotsford/arrford


Versuch es selber

Tonic Link

Dawson B.
quelle
1

Ab Chrome 72 ist es möglich, Intl.ListFormat zu verwenden :

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"

Bitte beachten Sie, dass sich dieser Weg in einem sehr frühen Stadium befindet. Erwarten Sie daher ab dem Datum der Veröffentlichung dieser Antwort eine Inkompatibilität mit älteren Versionen von Chrome und anderen Browsern.

Eliya Cohen
quelle
0
var arr = ["Pro1", "Pro2", "Pro3"];
console.log(arr.join());// Pro1,Pro2,Pro3
console.log(arr.join(', '));// Pro1, Pro2, Pro3
Akash
quelle
0
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s); // => Zero,One,Two
Alejandro
quelle
1
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen. Dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!
Kayess
0

Diese Lösung entfernt auch Werte wie " ":

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

console.log(result); // => foo, bar
Yorkshireman
quelle