114 votes

Virgule inattendue dans map()

J'ai un tableau contenant une liste d'éléments et j'essaie d'ajouter cette liste à un élément HTML en utilisant des chaînes de modèle :

var description = [
  'HTML & CSS',
  'Javascript object-oriented programming',
  'Progressive Web apps (PWAs)',
  'Website Performance Optimization',
  'Webpack and Gulp workflows',
  'Fullstack React.js',
  'Web Components',
  'Responsive web design',
  'Sketch design',
  'GraphQL and Relay'
]

$('body').append(
  `
  <div class="description">
    <ul>
      ${description.map(
        function(work) {
          return `<li>${work}</li>`
        }
      )}</ul>
  </div>
  `
)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

En conséquence, j'obtiens une virgule inattendue entre chaque élément de la liste. (Vous pouvez le voir lorsque vous exécutez l'extrait de code ci-dessus).

Comment puis-je éviter cela ?

0 votes

El map() est correcte. Le problème devrait venir d'ailleurs

0 votes

Il semble que vous utilisiez une sorte de langage de modélisation ; lequel ?

0 votes

J'utilise un simple JS (ES2015) ici (juste une sélection jQuery pour le corps et pour ajouter l'élément). J'ai ajouté un extrait à la description.

257voto

Roman Points 2400

Explication

littéraux de modèle utiliser le toString() qui, par défaut, joint le tableau retourné par la méthode map avec un , .
Pour éviter ce "problème", vous pouvez utiliser join('')

Code

var description = [
  'HTML & CSS',
  'Javascript object-oriented programming',
  'Progressive Web apps (PWAs)',
  'Website Performance Optimization',
  'Webpack and Gulp workflows',
  'Fullstack React.js',
  'Web Components',
  'Responsive web design',
  'Sketch design',
  'GraphQL and Relay'
]

$('body').append(
  `
  <div class="description">
    <ul>
     ${
        description.map(function(work) {
          return `<li>${work}</li>`
        }).join('')
      }
    </ul>
  </div>
  `
)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0 votes

Wow, je ne peux pas croire que j'ai oublié de join() mon tableau. Merci, haha !

2 votes

Je me demande comment cette réponse acceptée est dans les mêmes minutes que les autres ci-dessous.

34voto

Michael Geary Points 10391

.map() renvoie un tableau . Vous voulez probablement renvoyer un chaîne de caractères contenant les éléments du tableau concaténés ensemble. Vous pouvez le faire avec .join('') :

var description = [
  'HTML & CSS',
  'Javascript object-oriented programming',
  'Progressive Web apps (PWAs)',
  'Website Performance Optimization',
  'Webpack and Gulp workflows',
  'Fullstack React.js',
  'Web Components',
  'Responsive web design',
  'Sketch design',
  'GraphQL and Relay'
]

$('body').append(
  `
  <div class="description">
    <ul>
      ${description.map(
        function(work) {
          return `<li>${work}</li>`
        }
      ).join('') /* added .join('') here */}</ul>
  </div>
  `
)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

0 votes

Comment map retourne-t-il un tableau ? nous lui demandons déjà de retourner un modèle littéral, n'est-ce pas ?

0 votes

Pouvez-vous préciser ce que vous demandez ? .map retourne toujours un tableau. Nous ne pouvons pas lui demander de retourner un modèle littéral et nous ne le faisons pas ici.

0 votes

``` ${description.map( function(work) { return <li>${work}</li> Ici, nous retournons le modèle littéral. <li>${work}</li> C'est ça ? Alors comment est-ce que ça se convertit en tableau ?

9voto

Ivar Points 3112

Comme d'autres l'ont souligné (et je vais le répéter pour être complet), Array.prototype.map renvoie un nouveau tableau qui contient les éléments qui sont modifiés dans la fonction qui lui est passée.

Lorsque vous concaténerez un tableau à une chaîne de caractères (ce qui est le cas ici), le tableau sera également converti en chaîne de caractères. Et lorsqu'un tableau est converti en chaîne, il est automatiquement joint par des virgules.

const arr = ['<a>', '<b>'];

console.log(arr + ""); // <a>,<b>

En plus d'utiliser .join() pour transmettre explicitement une chaîne vide en tant que séparateur, vous pouvez également remplacer la balise .map() avec un Array.prototype.reduce pour réduire le tableau à une seule valeur.

description.reduce((acc, work) => acc + `<li>${work}</li>`, '')

Le code complet ressemblerait donc à ceci :

var description = [
  'HTML & CSS',
  'Javascript object-oriented programming',
  'Progressive Web apps (PWAs)',
  'Website Performance Optimization',
  'Webpack and Gulp workflows',
  'Fullstack React.js',
  'Web Components',
  'Responsive web design',
  'Sketch design',
  'GraphQL and Relay'
]

$('body').append(
  `
  <div class="description">
    <ul>
     ${
        description.reduce((acc, work) => acc + `<li>${work}</li>`, '')
      }
    </ul>
  </div>
  `
)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

2voto

Erdeprof Points 1

Pour simplifier votre code, j'utilise simplement ce qui suit : ${description.map((travail) => <li>${work}</li> ).join('')}

0 votes

Il est préférable d'en faire un commentaire plutôt qu'une réponse. Comme il ne clarifie pas le problème original de l'OP. Mais plutôt introduit une syntaxe différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X