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 это кошки', 'тигр', 'лев'));
Афоризм дня:
Любить глубоко – это значит забыть о себе. (581)
By Admin
On December 07, 2019