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.)
La méthode Array.prototype.join () :
var arr = ["Zero", "One", "Two"];
document.write(arr.join(", "));
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.
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.
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");
};
}
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(',');
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.
Utilisez la méthode Array.toString
intégrée
var arr = ['one', 'two', 'three'];
arr.toString(); // 'one,two,three'
Si vous devez utiliser "et" au lieu de "," vous pouvez le faire:
function arrayToList(array){
return array
.join(", ")
.replace(/, ((?:.(?!, ))+)$/, ' and $1');
}
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.
Voulez-vous terminer avec un "et"?
Pour cette situation, j'ai créé un module npm.
Essayez 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
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.
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"
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.
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(', ');
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
var array = ["Zero", "One", "Two"];
var s = array + [];
console.log(s); // => Zero,One,Two