Заметки

Аналог 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 это кошки', 'тигр', 'лев'));
Афоризм дня:
Лучше думать перед тем, как действовать, чем после. (591)

4 years ago

<h2>Привет</h2>

Leave a reply

Яндекс.Метрика