Notes
Аналог sprintf в Vanilla JS, (подстановка переменных в строку)
//1. Простейший вариант let str = '%s и %s это кошки'; function sprintf(format) { var args = Array.prototype.slice.call(arguments, 1); var i = 0; return format.replace(/%s/g, function() { return args[i++]; }); } console.log(sprintf(str, 'тигр', 'лев')); /* Здесь мы использовали доступ к «лишним» аргументам значений которых нет в списке. Доступ к ним осуществляется через «псевдо-массив» arguments. */ // 2. Используя новые возможности ES6 "оставшиеся параметры" и стрелочные функции можем переписать это так: function sprintf(format, ...args) { let i = 0; return format.replace(/%s/g, () => args[i++]); } /* Rest parameters - https://caniuse.com/#feat=rest-parameters Arrow functions - https://caniuse.com/#feat=arrow-functions */ console.log(sprintf(str, 'тигр', 'лев')); //3. //Template Literals variant : function template(strings, ...keys) { return (function(...values) { var dict = values[values.length - 1] || {}; var result = [strings[0]]; keys.forEach(function(key, i) { var value = Number.isInteger(key) ? values[key] : dict[key]; result.push(value, strings[i + 1]); }); return result.join(''); }); } var t1Closure = template `${0}${1}${0}!`; console.log(t1Closure('Y', 'A')); // "YAY!" let names = { maya: 'maiya', run: 'runner', pass: 'passer', fail: 'failer', }; var t2Closure = template `${0} ${'run'}!`; console.log(t2Closure('Hello', names)); // "Hello runner!" //4. Мой окончательный универсальный вариант, принимающий и строки и объекты: function sprintf(format, ...args) { if ((typeof args[0] === 'object') && args[0] !== null) { for (let [key, value] of Object.entries(args[0])) { let regExp = new RegExp('%' + key + '','g'); // regex pattern string //Worth noting: myString is the regular expression with NO begin and end marker, i.e. not "/foo[123]/", but "foo[123]" // console.log('key - '+key+'. Value - '+value); // console.log('new regExp - '+regExp); format = format.replace(regExp, value); } return format; } else { let i = 0; return format.replace(/%s/g, () => args[i++]); } } console.log(sprintf('%s и %s это кошки', 'тигр', 'лев'));
Афоризм дня:
Любовь, подобно теплу, должна согревать со всех сторон и склоняться в ответ на любую мольбу наших братьев. (572)
4 years ago
<h2>Привет</h2>