【问题标题】:Template Literals with a ForEach in it带有 ForEach 的模板文字
【发布时间】:2018-06-30 07:12:13
【问题描述】:

是否可以在模板文字中返回 ForEach 中的字符串值,以便将其添加到该位置?因为如果我记录它,它会返回undefined。还是像我输入的那样根本不可能?

return `<div>
                <form id='changeExchangeForViewing'>
    <label for='choiceExchangeForLoading'>Change the exchange</label>
    <div class='form-inline'>
    <select id='choiceExchangeForLoading' name='choiceExchangeForLoading' class='form-control'>

    ${Object.keys(obj).forEach(function (key) {
        return "<option value='" + key + "'>" + obj[key] + "</option>"           
    })}
    `;

【问题讨论】:

标签: javascript jquery string template-literals


【解决方案1】:

不,因为forEach 会忽略其回调的返回值并且从不返回任何内容(因此,调用它会导致undefined)。

您正在寻找map,它正是您想要的:

return `<div>
                <form id='changeExchangeForViewing'>
    <label for='choiceExchangeForLoading'>Change the exchange</label>
    <div class='form-inline'>
    <select id='choiceExchangeForLoading' name='choiceExchangeForLoading' class='form-control'>

    ${Object.keys(obj).map(function (key) {
        return "<option value='" + key + "'>" + obj[key] + "</option>"           
    }).join("")}
    `;

请注意,映射后,代码使用.join("") 从数组中获取单个字符串(不带任何分隔符)。 (我最初忘记了这一点——我做了太多 React 的事情——但stephledevhis/her answer 中指出了这一点。)


旁注:这不是“字符串文字”,而是template literal

【讨论】:

  • 我觉得有 15 分钟你不能接受
  • @nitte93user3232918 我需要等待 9 分钟
  • 我建议最好将代码移到函数中以保持整洁,以便在回调中使用单独的模板文字。
  • @rockstar:是的,我完全同意。
  • @GalibHasanov - 因为调用forEach 的结果总是undefined,但是调用map 的结果是一个包含映射内容的数组。
【解决方案2】:

由于map() 返回一个数组,@T.J. Crowder 的回答将产生无效的 HTML,因为数组的 toString() 方法将在模板文字内被调用,模板文字使用逗号分隔数组。要解决此问题,只需附加 join('') 以显式不使用分隔符:

${Object.keys(obj).map(key => (
    `<option value="${key}">${obj[key]}</option>`
)).join('')}

此外,您可以在地图本身内使用模板文字。

【讨论】:

  • 当您看到这样的小疏忽时,发表评论并让回答者知道会更有用。 (我最近做的 React 太多了!)SO 意味着协作。
  • 仅供参考,任何人在 stephledev 的答案中阅读这些 cmets,该修复程序已集成到已接受的答案中,因此这里没有什么可看的。 ;)
  • 正是我在文字中寻找的内容。
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多