[197 vues] 2022-06-28 Emmanuel Orchanian
NOTE : cet article a été affiché dans sa langue originale.
La virgule traînante, qu'est ce que c'est ?
La virgule sert de séparateur dans une liste
printemps, été, automne, hiver
La virgule traînante (en anglais trailing comma) est une virgule qui traîne à la fin de la liste, sans élément derrière :
printemps, été, automne, hiver,
Quand la virgule traînante est autorisée
Dans les tableaux et objets PHP et JavaScript
toto = [ "été", "automne", "hiver", "printemps" ] ;
toto = [ "été", "automne", "hiver", "printemps" , ] ;
Quand la virgule traînante est conseillée
Pour les écritures verticales des tableaux
toto = [
"été",
"automne",
"hiver",
"printemps"
] ;
toto = [
"été",
"automne",
"hiver",
"printemps" ,
] ;
Dans ce code, nous pouvons facilement dupliquer les lignes (
Il est conseillé de placer une virgule traînante dans les listes écrites verticalement.
Quand la virgule traînante est interdite
En JSON (ce code ne fonctionnera PAS)
[1, 2, 3, 4, ]
En SQL (ce code ne fonctionnera PAS)
SELECT prenom, nom, age,
FROM user
Comment remédier à ça ?
La méthode que je ne conseille pas mais que beaucoup de gens font : suffixer une virgule, puis enlever le dernier
On boucle en suffixant d'une virgule, tout à la fin on enlève la dernière virgule
// exemple d'une navigation à facette, et on veux en fonction écrire une requête SQL
let arrayAttributs = []
if (boolPrenomChecked) arrayAttributs.push('prenom')
if (boolNomChecked) arrayAttributs.push('nom')
if (boolAgeChecked) arrayAttributs.push('age')
if (boolZodiacChecked) arrayAttributs.push('zodiac')
let strAttributs = ''
for (let v for arrayAttributs){
strAttributs += v + ',' // ON REMPLI EN AJOUTANT LE SEPARATEUR A LA FIN
}
strAttributs = strAttributs.substring(0, strAttributs.length - 1) // on met strAttributs.length-1 pour enlever le dernier caractère
// ON ENLEVE LE DERNIER SEPARATEUR (LA VIRGULE TRAINANTE)
return " SELECT " + strAttributs + " FROM user ; "
// exemple d'une navigation à facette, et on veux en fonction écrire une requête SQL
$array_attributs = [] ;
if (bool_prenom_checked) $array_attributs[] = 'prenom' ;
if (bool_nom_checked) $array_attributs[] = 'nom' ;
if (bool_age_checked) $array_attributs[] = 'age' ;
if (bool_zodiac_checked) $array_attributs[] = 'zodiac' ;
$str_attributs = ''
foreach($array_attributs as $v)
str_attributs .= "$v," ;// ON REMPLI EN AJOUTANT LE SEPARATEUR A LA FIN
}
$str_attributs = rtrim($str_attributs,',');
// ON ENLEVE LE DERNIER SEPARATEUR (LA VIRGULE TRAINANTE)
return " SELECT $str_attributs FROM user ; " ; // (sans requête préparée)
Le souci de cette technique est que si au lieu d'une virgule comme séparateur, je veux une virgule suivi d'une espace, ça va me poser problème...
Mais généralement ça pose problème par la mentalité, c'est un type d'opération qu'on fait énormément, et le fait d'enlever à la fin pose souvent problème dans tous les types de situations variés qui existent...
La technique que je recommande : tabuler et imploser
Comprenez "mettre sous forme de tableau, puis transformer le tableau en un seul texte".
L'exemple avec
/|\ est une sorte de blague pour dire que la glue peut être le texte que vous voulez.
// exemple d'une navigation à facette, et on veux en fonction écrire une requête SQL
let arrayAttributs = []
if (boolPrenomChecked) arrayAttributs.push('prenom')
if (boolNomChecked) arrayAttributs.push('nom')
if (boolAgeChecked) arrayAttributs.push('age')
if (boolZodiacChecked) arrayAttributs.push('zodiac')
let strAttributs = arrayAttributs.join() // par défaut la glue est une virgule en JavaScript
return " SELECT $str_attributs FROM user ; " ; // (sans requête préparée)
// exemple d'une navigation à facette, et on veux en fonction écrire une requête SQL
$array_attributs = [] ;
if (bool_prenom_checked) $array_attributs[] = 'prenom' ;
if (bool_nom_checked) $array_attributs[] = 'nom' ;
if (bool_age_checked) $array_attributs[] = 'age' ;
if (bool_zodiac_checked) $array_attributs[] = 'zodiac' ;
$str_attributs = implode(',' , $array_attributs) ;
return " SELECT $str_attributs FROM user ; " ; // (sans requête préparée)
Liens
Bonne explication du "trailing comma"
Merci d'avoir lu !
Si en général vous avez une question, une curiosité, n'hésitez pas me contacter.