``` function substitute(obj, str) { return str.replace(/\${([^}]*)}/g, (m, p) => obj[p]); }
substitute({ year: 2015 }, 'This is year ${year}'); // === 'This is year 2015' ``` On Wed, Aug 12, 2015 at 4:42 PM, Nathaniel Higgins <n...@nath.is> wrote: > Am I being naive or could this just be written in user space? > > Sent from my iPhone > > On 12 Aug 2015, at 15:31, Edwin Reynoso <eor...@gmail.com> wrote: > > Yes of course, still requires 1.Destructuring, and making a function for > each type of string to return. Defeats the purpose. > > I'd have to make different functions for each template: > > ```JS > const yearTemplate = ({ year }) => `This year is ${year}`; > > const ageTemplate = ({ age}) => `I'm ${age} yrs old`; > ``` > > Compare to: > > ```JS > let yearSentence = String.substitute({ year: 2015}, `This year is > ${year}`); > let ageSentence = String.substitute({ age:100 }, `I'm ${age} yrs old`); > ``` > > On Wed, Aug 12, 2015 at 10:19 AM, Claude Pache <claude.pa...@gmail.com> > wrote: > >> >> > Le 12 août 2015 à 15:41, Edwin Reynoso <eor...@gmail.com> a écrit : >> > >> > Could we make the following possible, I can't seem to think of a way to >> do it, since template literals are evaluated with the current scope, also >> tried with `eval` but shouldn't even use that at all: >> > >> > ```JS >> > String.substitute( { year: 2015 }, `This year is ${year}` ); // Returns >> "This year is 2015" >> > ``` >> > >> > Yes I'm aware I could do the following: >> > >> > ```JS >> > var obj = { year:2015 } >> > >> > `This year is ${obj.year}` >> > ``` >> > >> > The point is to get rid of the part where I reference `obj` all the >> time. >> > >> > I could just use destructuring: >> > >> > ```JS >> > var { year } = { year: 2015 } >> > >> > `This year is ${year}` >> > ``` >> > >> > So yes destructuring takes care of most of this just fine, but the >> point is to have a template literal evaluate as a pass reference and not >> right away. >> > >> > You can't make your own function and pass in a template literal that's >> not evaluated when passed as a reference, I'm not sure if anyone will >> actually want this but me. Please let me know. Thanks >> >> There is a general trick for deferring evaluation (of a template literal >> or of anything else): enclosing it in a function. >> >> ```js >> const myTemplate = ({ year }) => `This year is ${year}` >> >> myTemplate({ year: 2015 }) >> ``` >> >> —Claude >> >> > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss