96

我有一个包含元素列表的数组,我正在尝试使用模板字符串将此列表附加到 HTML 元素:

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>

结果,我在每个列表元素之间得到了一个意外的逗号。(您可以在运行上面的代码片段时看到这一点。)

我怎样才能避免这种情况?

4

4 回答 4

218

解释

模板文字使用toString()默认连接返回数组的map方法 ,
为避免此“问题”,您可以使用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('')
      }
    </ul>
  </div>
  `
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2017-08-22T08:11:27.203 回答
30

.map()返回一个数组。您可能希望返回一个包含串联在一起的数组元素的字符串。你可以这样做.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>

于 2017-08-22T08:11:27.847 回答
7

正如其他人所指出的(为了完整起见,我将重复一遍),Array.prototype.map返回一个新数组,其中包含在传递给它的函数中更改的元素。

当您将数组连接到字符串时(这就是这里发生的事情),它也会将数组转换为字符串。并且当数组转换为字符串时,它会自动使用逗号连接。

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

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

除了.join()用于显式传递一个空字符串作为分隔符外,您还可以将 替换为.map()aArray.prototype.reduce以将数组缩减为单个值。

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

所以完整的代码如下所示:

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>

于 2020-07-02T08:10:03.720 回答
2

为了简单的代码,我只是这样使用: ${description.map((work) => <li>${work}</li>).join('')}

于 2021-06-25T02:37:16.320 回答