Am un one-dimensional matrice de siruri de caractere în JavaScript care am'd place să se transforme într-o listă separată prin virgulă. Există un mod simplu în grădină JavaScript (jQuery sau) pentru a transforma într-o listă separată prin virgulă? (Știu cum de a repeta prin matrice și de a construi șirul mine prin concatenarea dacă asta's singura cale.)
La Array.prototype.join() metoda:
var arr = ["Zero", "One", "Two"];
document.write(arr.join(", "));
De fapt, `toString () de implementare a face o asociere cu virgule în mod implicit:
var arr = [ 42, 55 ];
var str1 = arr.toString(); // Gives you "42,55"
var str2 = String(arr); // Ditto
Eu nu't știu dacă acest lucru este mandatat de către JS spec dar acest lucru este ceea ce mai cam tot browsere par să faci.
Sau (mai eficient):
var so = new Array(3); arr[0] = "Zero"; arr[1] = "O"; arr[2] = "Doi";document.scrie(arr); // la fel ca document.scrie(arr.toString()) în acest context
La metoda toString de o matrice atunci când este solicitat se întoarce exact ceea ce ai nevoie - listă separată prin virgulă.
Aici's o implementare care convertește un tablou bidimensional sau o serie de coloane într-un mod corespunzător a scăpat CSV șir. Funcțiile nu se verifica pentru șir valid/numărul de intrare sau de coloană contează (asigura matrice este valabil pentru a începe cu). Celulele pot conține virgule și citate!
Aici's a script-ul pentru decodare CSV siruri de caractere.
Aici's my script pentru codificarea CSV siruri de caractere:
// 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");
};
}
Cred că asta ar trebui să faci:
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(',');
Practic tot ce face este de a verifica dacă șirul conține o virgulă sau citat. Dacă o face, atunci se dubleaza toate citatele, și pune citate pe capete. Apoi se alătură fiecare dintre părți cu o virgulă.
Există mai multe metode pentru a converti o serie de listă separată prin virgule
De MDN
join() metoda se alătură toate elementele unei matrice (sau o mulțime-ca obiect) într-un șir.
Codul
var arr = ["this","is","a","comma","separated","list"];
arr = arr.join(",");
var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr.join(",");
console.log(arr);
Din MDN
toString() metoda returnează un șir care reprezintă specificate matrice și elementele sale.
Codul
var arr = ["this","is","a","comma","separated","list"];
arr = arr.toString();
var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr.toString();
console.log(arr);
La []+ sau +[] se va transforma într-un șir
([]+[] === [].toString())
va ieșire true
console.log([]+[] === [].toString());
var arr = ["this","is","a","comma","separated","list"];
arr = []+arr;
var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = []+arr;
console.log(arr);
var arr = ["this","is","a","comma","separated","list"];
arr = arr+[];
var arr = ["this", "is", "a", "comma", "separated", "list"];
arr = arr + [];
console.log(arr);
Utilizați built-in Matrice.toString
metoda
var arr = ['one', 'two', 'three'];
arr.toString(); // 'one,two,three'
Dacă aveți nevoie pentru a utiliza " și " în loc de ", " între ultimele două elemente, puteți face acest lucru:
function arrayToList(array){
return array
.join(", ")
.replace(/, ((?:.(?!, ))+)$/, ' and $1');
}
De obicei găsesc eu nevoie de ceva care, de asemenea, sare de valoare în cazul în care valoarea este nul
sau nedefinit
, etc.
Deci, aici este solutia care functioneaza 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'
Cele mai multe dintre soluțiile de aici ar reveni `', mar' dacă matricea mea ar arata ca cel din al doilea exemplu. Ca's de ce am preferat această soluție.
Vrei să se încheie cu o "și"?
Pentru această situație, am creat un modul de nmp.
Încerca arrford:
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!'
npm install --save arrford
https://github.com/dawsonbotsford/arrford
Luarea inițială cod:
var arr = new Array(3);
arr[0] = "Zero";
arr[1] = "One";
arr[2] = "Two";
Inițial răspunde de utilizarea alăturați-vă funcție este ideală. Un lucru să ia în considerare ar fi cea mai mare utilizare din șir.
Pentru utilizarea în unele end textuale display:
arr.join(",")
=> "Zero,One,Two"
Pentru utilizarea într-un URL pentru a trece mai multe valori într-un (oarecum) Odihnitoare mod:
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ă. Doar ține sursă de date și de utilizare în minte și totul va fi în regulă cu lumea.
Tata Analiza (browser based) se ocupă de virgule în valori și alte cazuri de margine. Folosi Copil Analiza pentru Nod.
De exemplu. (nod)
const csvParser = require('babyparse');
var arr = [1,null,"a,b"] ;
var csv = csvParser.unparse([arr]) ;
console.log(csv) ;
1,,"b"
Această soluție elimină, de asemenea, valori cum ar fi" "`: `` rezultatul const = ['', null, 'foo', ' ', nedefinit, 'bar'].filter(el => { return Boolean(el) && el.tapiterie() !== ''; }).alăturați-vă(', ');
console.log(rezultat); // => foo, bar ``
Ca de Chrome 72, l's posibil să se utilizeze 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"
Vă rugăm să rețineți că în acest fel este în stadiu incipient, astfel încât de la data de a posta acest raspuns, astept incompatibilitate cu versiunile mai vechi de Chrome și alte browsere.