Modul simplu de a transforma matricea JavaScript în lista separată prin virgulă?

Am o gamă unidimensională de șiruri de caractere în JavaScript pe care aș vrea să le transform într-o listă separată prin virgulă. Există o modalitate simplă în JavaScript (sau jQuery) din grădina soiului pentru ao transforma într-o listă separată prin virgulă? (Știu cum să repet prin matrice și să construiesc eu șirul prin concatenare dacă aceasta este singura cale).

319
toString() : Dacă căutați cea mai simplă cale, este mai bine să utilizați toString() rel = "nofollow noreferrer"> Citește mai mult
adăugat autor Mohammad lm71, sursa

14 răspunsuri

Metoda Array.prototype.join() :

<div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false"> <div class="snippet-code">

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

document.write(arr.join(", "));
</div> </div>

603
adăugat
@ davewilliams459: Dar nu sunteți OP? Op a spus "o gamă unidimensională de șiruri de caractere". Siruri de caractere. Nu sunt ID-uri. Asta presupune că ar putea fi orice. Ceea ce înseamnă că pot conține și alte virgule.
adăugat autor mpen, sursa
@bostIT atâta timp cât sunteți sigur nu va apărea niciodată, da, aceasta este o soluție ușoară. Cred că ar trebui cel puțin să fie menționat în răspunsul este totul.
adăugat autor mpen, sursa
@Chris: Nu cred că sunt obligat să ofer o alternativă doar pentru a sublinia defectele dintr-o altă soluție. Cu toate acestea, am] .
adăugat autor mpen, sursa
@Wayne: Eu încă cred că un avertisment este în ordine :) Oamenii nu cred întotdeauna aceste lucruri prin, și apoi se împușcă în picioare mai târziu.
adăugat autor mpen, sursa
@Mark, ați putea întotdeauna delimita doar șiruri de caractere cu ceva care probabil nu ar apărea niciodată în datele lor, cum ar fi ";;;".
adăugat autor devinbost, sursa
@Mark - Comentariul dvs. este perfect valabil (după cum au indicat alții cu un upvote), dar mai util ar fi fost de a furniza răspunsul alternativ cu exemplul de cod?
adăugat autor Chris, sursa
@Mark: Răspunsul este corect pentru întrebarea cerută. Orice alte cerințe sunt lăsate individului să lucreze pentru ele însele. OP a cerut o listă separată prin virgulă, nu un format de tip CSV citat.
adăugat autor Wayne, sursa
@Mark: destul de adevărat, dar trebuie să concatenam lista de ID-uri, nici o șansă de virgule sau alte caractere speciale
adăugat autor davewilliams459, sursa

De fapt, implementarea toString() face în mod implicit o asociere cu virgule:

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

Nu stiu daca acest lucru este mandatat de spec. JS, dar asta este ceea ce most aproape toate browserele par sa faca.

80
adăugat
Există, de asemenea, arr + '' mai scurtă (dar mai puțin clară)
adăugat autor Oriol, sursa
performanța toString() și join (",") este aproximativ echivalentă din aprilie 2018
adăugat autor MattMcKnight, sursa
îmbinarea matricei este mai rapidă jsperf.com/tostring-join
adăugat autor Sameer, sursa
array.toString face loc de muncă fără spațiu după virgulă. Cu array.join ești flexibil.
adăugat autor jMike, sursa

Sau (mai eficient):

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

document.write(arr);//same as document.write(arr.toString()) in this context

Metoda toString a unui tablou când este apelată returnează exact ceea ce aveți nevoie - lista separată prin virgulă.

28
adăugat
În cele mai multe cazuri, toString este de fapt mai lent decît array join. Priviți aici: jsperf.com/tostring-join
adăugat autor Sameer, sursa

Iată o implementare care convertește o matrice bidimensională sau o matrice de coloane într-un șir CSV corect evadat. Funcțiile nu verifică dacă există intrări stringale/numerice valide sau numere de coloane (asigurați-vă că matricea este validă pentru început). Celulele pot conține virgule și citate!

Iată un script pentru decodarea șirurilor de caractere CSV .

Iată scriptul meu pentru codarea șirurilor 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
adăugat

Cred că ar trebui să o facă:

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

violoncel

Practic tot ceea ce face este să verifici dacă șirul conține o virgulă sau un citat. Dacă se întâmplă, atunci se dublează toate citatele și se pun citate în final. Apoi se alătură fiecărei părți cu o virgulă.

10
adăugat
@JoshuaBurns wikipedia spune că ghilimele duble ar trebui să scape cu o altă cotare, dar nu există niciun standard formal. Dacă cititorul CSV necesită ceva diferit, nu ezitați să modificați și/sau să scăpați;)
adăugat autor mpen, sursa
Noooooooooo! A fost tentat să coboare. Ce se întâmplă dacă citatele ar trebui scăpate cu spate ?! Trebuie să fie variabile. ;)
adăugat autor Joshua Burns, sursa
De fapt, există un RFC, tools.ietf.org/rfc/rfc4180.txt , și că este corect dublu citate ar trebui să fie scape cu ghilimele duble.
adăugat autor Steve Buzonas, sursa
@SteveBuzonas, tocmai l-ai pioniat pe tipul cu RFC.
adăugat autor devinbost, sursa

Utilizați metoda Array.toString

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

MDN pe Array.toString()

6
adăugat

De obicei, mi se pare că am nevoie de ceva care să depășească valoarea, dacă această valoare este null sau undefined etc.

Deci, aici este soluția care funcționează pentru mine:

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

Majoritatea soluțiilor de aici ar reveni ', apple' dacă matricea mea ar arăta ca cea din cel de-al doilea exemplu. De aceea prefer această soluție.

3
adăugat

Dacă trebuie să utilizați "și" în loc de "," între ultimele două elemente, puteți face acest lucru:

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

Există multe metode pentru a converti o matrice în lista separată prin virgulă

1. Folosind matricea # join

From MDN

Metoda join() îmbină toate elementele unui matrice (sau un obiect asemănător unui array) într-un șir.

Codul

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

Fragment

<div class="Fragment" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="Fragment-code Fragment-currently-hidden">

var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr.join(",");
console.log(arr);
</div> </div>

2. Folosind array # toString

From MDN

Metoda toString() returnează un șir reprezentând matricea specificată și elementele acesteia.

Codul

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

Fragment

<div class="Fragment" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="Fragment-code Fragment-currently-hidden">

var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr.toString();
console.log(arr);
</div> </div>

3. Adăugați [] + înainte de matrice sau + [] după un tablou

[] + sau + [] îl va converti într-un șir

dovadă

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

will output true

<div class="Fragment" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="Fragment-code Fragment-currently-hidden">

console.log([]+[] === [].toString());
</div> </div>

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

Fragment

<div class="Fragment" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="Fragment-code Fragment-currently-hidden">

var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = []+arr;
console.log(arr);
</div> </div>

De asemenea

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

<div class="Fragment" data-lang="js" data-hide="true" data-console="true" data-babel="false"> <div class="Fragment-code Fragment-currently-hidden">

var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr + [];
console.log(arr);
</div> </div>

2
adăugat
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s);//=> Zero,One,Two
1
adăugat
Deși acest fragment de cod poate rezolva această întrebare, include o explicație într-adevăr ajută la îmbunătățirea calității din postarea ta. Amintiți-vă că răspundeți la întrebări pentru cititori în viitor și acei oameni ar putea să nu știe motivele pentru sugestia dvs. de cod. Vă rugăm, de asemenea, să încercați să nu mulțim codul dvs. cu comentarii explicative, acest lucru reduce lizibilitatea atât cod și explicații!
adăugat autor kayess, sursa

Luând codul inițial:

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

Răspunsul inițial al utilizării funcției de îmbinare este ideal. Un lucru de luat în considerare ar fi utilizarea ulterioară a șirului.

Pentru a utiliza într-un anumit scop afișarea textuală:

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

Pentru utilizarea într-o adresă URL pentru transmiterea mai multor valori într-o manieră (într-o oarecare măsură) 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"

Desigur, totul depinde de utilizarea finală. Păstrați doar sursa de date și folosiți-o în minte și totul va avea dreptate cu lumea.

1
adăugat

Doriți să o terminați cu un "și"?

Pentru această situație, am creat un modul npm.

Încercați arrford :


folosire

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


Instalare

npm Instalare --save arrford


Citeste mai mult

https://github.com/dawsonbotsford/arrford


Incearca-l tu insuti

Tonic link

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

Papa Parse (browser based) handles commas in values and other edge cases. Use Baby Parse for Node.

De exemplu. (nodul)

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

1 , "a, b"

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com