Tenho um conjunto unidimensional de cordas em JavaScript que I'gostaria de transformar numa lista separada por vírgulas. Existe alguma forma simples em JavaScript (ou jQuery) de transformar isso numa lista separada por vírgulas? (Sei como iterar através da matriz e construir eu próprio o fio por concatenação se esse's for o único caminho).
O método Array.prototype.join():
var arr = ["Zero", "One", "Two"];
document.write(arr.join(", "));
Na verdade, a implementação toString()
faz uma junção com vírgulas por defeito:
var arr = [ 42, 55 ];
var str1 = arr.toString(); // Gives you "42,55"
var str2 = String(arr); // Ditto
Não sei se isto é exigido pelas especificações do JS, mas isto é o que most praticamente tudo os navegadores parecem estar a fazer.
Ou (mais eficientemente):
var arr = novo Array(3); arr[0] = "Zero"; arr[1] = "One"; arr[2] = "Two";document.write(arr); // o mesmo que document.write(arr.toString()) neste contexto
O método toString de um array quando chamado devolve exactamente o que precisa - lista separada por vírgulas.
Aqui's uma implementação que converte um array bidimensional ou um array de colunas em uma string CSV devidamente escapada. As funções não verificam a entrada de strings/números ou contagens de colunas válidas (assegure-se de que seu array é válido para começar). As células podem conter vírgulas e aspas!
Aqui's um [script para decodificar strings CSV][1].
Aqui's o meu [script para codificar strings CSV][2]:
// 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");
};
}
[1]: https://github.com/thetalecrafter/excel.js/blob/master/src/csv.js [2]:
Acho que isto deve servir:
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](
)Basicamente, tudo o que faz é verificar se a string contém uma vírgula ou citação. Se contém, então duplica todas as aspas, e coloca aspas nas pontas. Depois junta cada uma das partes com uma vírgula.
Há muitos métodos para converter um array para uma lista separada por vírgulas
Usando array#join
De MDN
O método join() une todos os elementos de um array (ou um objeto parecido com um array) em uma string.
O código
var arr = ["this","is","a","comma","separated","list"];
arr = arr.join(",");
Usando array#toString
De MDN
O método toString() retorna uma string representando o array especificado e seus elementos.
O código
var arr = ["this","is","a","comma","separated","list"];
arr = arr.toString();
Adicione []+ antes do array ou +[] depois de um array
O []+ ou +[] irá convertê-lo em uma cadeia
([]+[] === [].toString())
irá sair verdadeiro
var arr = ["this","is","a","comma","separated","list"];
arr = []+arr;
var arr = ["this","is","a","comma","separated","list"];
arr = arr+[];
Utilize o método integrado `Array.toString'.
var arr = ['one', 'two', 'three'];
arr.toString(); // 'one,two,three'
Se precisar de usar o " e " em vez do ", " entre os dois últimos itens, você pode fazer isso:
function arrayToList(array){
return array
.join(", ")
.replace(/, ((?:.(?!, ))+)$/, ' and $1');
}
Eu geralmente me vejo precisando de algo que também salte o valor se esse valor for "nulo" ou "indefinido", etc.
Então aqui está a solução que funciona para mim:
// 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'
A maioria das soluções aqui retornariam ', apple'
se meu array se parecesse com o do meu segundo exemplo.
É por isso que eu prefiro esta solução.
Você quer terminar com um " e"?
Para esta situação, eu criei um módulo npm.
Tente [arrford][1]:
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][1] [2]
[Ligação tônica][2]
[1]: https://github.com/dawsonbotsford/arrford [2]: https://tonicdev.com/dawsonbotsford/56f46dd154d4e814002e34b9
Pegando o código inicial:
var arr = new Array(3);
arr[0] = "Zero";
arr[1] = "One";
arr[2] = "Two";
A resposta inicial de usar a função de união é ideal. Uma coisa a considerar seria o uso final da corda.
Para usar em alguma exibição textual final:
arr.join(",")
=> "Zero,One,Two"
Para usar em uma URL para passar múltiplos valores de uma maneira (um pouco) 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"
Claro, tudo depende do uso final. Basta manter a fonte de dados e o uso em mente e tudo estará certo com o mundo.
Eu gostei da solução em [
][1] porque ela adiciona espaços após vírgulas:array = ["test","test2","test3"]
array = array.toString();
array = array.replace(/,/g, ", ");
alert(array);
Ou, como sugerido por @StackOverflaw nos comentários:
array.join(', ');
[1]:
[Papa Parse][1] (baseado no navegador) lida com vírgulas em valores e outros casos de bordas. Use [Baby Parse][2] para Node.
Ex. (nó)
const csvParser = require('babyparse');
var arr = [1,null,"a,b"] ;
var csv = csvParser.unparse([arr]) ;
console.log(csv) ;
1,,"a,b"
[1]: http://papaparse.com/ [2]: https://github.com/Rich-Harris/BabyParse
Esta solução também remove valores tais como " "
:
const resultado = ['', nulo, 'foo', '
', indefinido, 'bar'].filter(el =>
{
devolver Boolean(el) &&
el.trim() !== '';
}).join(', ');
console.log(resultado);
// =>
foo, bar
A partir de [Chrome 72][1], é possível usar [Intl.ListFormat][2]:
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"
Por favor, note que esta forma está em sua fase muito anterior, portanto, a partir da data de postagem desta resposta, espere incompatibilidade com versões mais antigas do Chrome e outros navegadores.
[1]: https://developers.google.com/web/updates/2019/01/nic72#intl-format [2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ListFormat