Blog Emmanuel Orchanian

astuce bdd bureautique codage culture débat design énigme français hacking html mathématiques méthodologie santé typographie 

 

 [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 (CTRL+SHIFT+D), il n'y aura pas besoin de rajouter de virgule à la fin, elle y est déjà.
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".

implosion en informatique
L'implosion (ou le collage consiste à transformer un tableau en texte en accolant chaque morceau, et en fonction d'un séparateur (qu'on surnomme glue ou join))
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.