{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/en/2016-07-18-generic-html-list-using-template-strings/","webpackCompilationHash":"a3ac22c47fe06e2afd02","result":{"data":{"markdownRemark":{"id":"7b287c01-3a65-5175-87b9-e9c6262d0078","html":"<h3 id=\"problem\"><a href=\"#problem\" aria-label=\"problem permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Problem</h3>\n<ul>\n<li>\n<p>In <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a> we saw how to use template strings to generate an HTML list\nbased on an array of objects:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> persons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'John'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'London'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Doe'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Dave'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Smith'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n     city<span class=\"token punctuation\">:</span> <span class=\"token string\">'London'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    firstName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Jane'</span><span class=\"token punctuation\">,</span>\n    lastName<span class=\"token punctuation\">:</span> <span class=\"token string\">'Carpenter'</span><span class=\"token punctuation\">,</span>\n    address<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n      city<span class=\"token punctuation\">:</span> <span class=\"token string\">'Birmingham'</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n<li>\n<p>However our solution had one limitation: it only works for those objects that\nhave <code class=\"language-text\">firstName</code> and <code class=\"language-text\">lastName</code> properties but it doesn’t work for other objects.\nFor example the following code …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">let</span> cities <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Ney York'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Miami'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'San Francisco'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Chicago'</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">:</span> <span class=\"token string\">'Seattle'</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… generates this HTML code:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>NaN<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n</li>\n<li>So what we really want is a generic function <code class=\"language-text\">listItem()</code> that works with every type of object.\nFortunately this is relatively easy as we see in today’s recipe.</li>\n</ul>\n<h3 id=\"ingredients\"><a href=\"#ingredients\" aria-label=\"ingredients permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ingredients</h3>\n<ul>\n<li>the <code class=\"language-text\">htmlList()</code> function from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a></li>\n<li>the <code class=\"language-text\">htmlListItem()</code> function from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a></li>\n<li>closures</li>\n<li>partial application</li>\n</ul>\n<h3 id=\"directions\"><a href=\"#directions\" aria-label=\"directions permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Directions</h3>\n<ol>\n<li>\n<p>Given: the two functions <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> from <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>The idea now is that we change <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> to accept a function as\nparameter which determines the value (based on the particular object) that should be used for the list item\n(we call this function <em>value function</em>).\nBoth <code class=\"language-text\">htmlList()</code> and <code class=\"language-text\">htmlListItem()</code> will then return functions and close in the <em>value function</em>.</p>\n</li>\n<li>\n<p>Change <code class=\"language-text\">htmlListItem()</code> to accept a function (the <em>value function</em>) and return another function (this is where the closure comes in) …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>… and inside the returned function call the <em>value function</em> with the particular object as argument.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Change <code class=\"language-text\">htmlList()</code> as well so that it accepts a <em>value function</em> and returns another function (again, this creates a closure) …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>htmlListItem<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>… and inside the returned function call <code class=\"language-text\">htmlListItem()</code> with the <em>value function</em> as argument.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlListItem</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n  &lt;li></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span><span class=\"token function\">fn</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/li></span><span class=\"token template-punctuation string\">`</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">htmlList</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">fn</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">array</span> <span class=\"token operator\">=></span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">&lt;ul></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>array<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListItem</span><span class=\"token punctuation\">(</span>fn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">join</span><span class=\"token punctuation\">(</span><span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\n&lt;/ul></span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n</li>\n<li>\n<p>Voilá, now you can use the <code class=\"language-text\">htmlList()</code> to produce the HTML list code for any type of objects by simply passing\na <em>value function</em> that determines the value used for the label of the list item:</p>\n<p>For example this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… produces this HTML code …</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Ney York<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Miami<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>San Francisco<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Chicago<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Seattle<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>… while this code here …</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>… produces this HTML code:</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>John Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Doe<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Dave Smith<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>Jane Carpenter<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n</li>\n</ol>\n<h3 id=\"notes\"><a href=\"#notes\" aria-label=\"notes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Notes</h3>\n<ul>\n<li>\n<p>You can also use partial application to create partial applied versions of <code class=\"language-text\">htmlList()</code>,\ni.e., functions where the <em>value function</em> is closed in.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> htmlListForCities <span class=\"token operator\">=</span>\n  <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> htmlListForPersons <span class=\"token operator\">=</span>\n  <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' '</span> <span class=\"token operator\">+</span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListForCities</span><span class=\"token punctuation\">(</span>cities<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">htmlListForPersons</span><span class=\"token punctuation\">(</span>persons<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"alternative-recipes\"><a href=\"#alternative-recipes\" aria-label=\"alternative recipes permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Alternative recipes</h3>\n<ul>\n<li>Use a template engine like EJS or Jade.</li>\n<li>\n<p>Another alternative is to use <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a>\nand introduce a common method in all objects, e.g., <code class=\"language-text\">toString()</code> or <code class=\"language-text\">getListLabel()</code>.</p>\n<p>However this approach has two disadvantages: first you cannot use object literal notation for creating the objects\nwithout defining the method over and over again in every object. That means you would need to use some sort of\ninheritance, which is not bad, but it adds complexity to your object model.</p>\n<p>The second disadvantage is that the logic of how an object is displayed in the generated list is tightly\ncoupled to the object. If you want to change the value, you always need to change the object model.\nWith the technique shown in today’s recipe we decoupled the logic from the object model (inside the <em>value function</em>).</p>\n<p>Finally, an advantage of today’s recipe is that you can easily create different <em>value functions</em> for one and the same\nobject model. For example, you could create two <em>value functions</em>, one just displaying the first name, one just displaying\nthe last name of a person:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> htmlListFirstName <span class=\"token operator\">=</span> <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> htmlListLastName <span class=\"token operator\">=</span> <span class=\"token function\">htmlList</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">object</span> <span class=\"token operator\">=></span> object<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span></code></pre></div>\n<p>With <a href=\"%7B%25%20post_url%202016-07-17-html-list-using-template-strings%20%25%7D\">yesterday’s recipe</a> this is not that easy.</p>\n</li>\n</ul>","fields":{"slug":"/posts/en/2016-07-18-generic-html-list-using-template-strings/","tagSlugs":["/tag/java-script/"]},"frontmatter":{"date":"2016-07-18T08:00:00.000Z","description":null,"tags":["JavaScript"],"title":"Create an HTML list based on an array using template strings - part 2"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/posts/en/2016-07-18-generic-html-list-using-template-strings/"}}}