Полезные фрагменты кода

Склонение слов после числительных

Number.prototype.decline = function(w1, w2, w5, complex) {
    var nn = this.valueOf() % 100, n = nn % 10;
    var w = n > 4 || n === 0 || nn - n === 10 ? w5 : (n === 1 ? w1 : w2);
    return complex === false ? w : (this.toString() + ' ' + w);
};
days.decline('день', 'дня', 'дней'); // для days = 23 вернёт строку "23 дня"

Иногда возникает необходимость вывести слово в нужной форме без числа. Например, число должно быть внутри какого-нибудь тега, или хочется показать его в виде числительного. В таком случае пригодится необязательный аргумент complex.

days.decline('день', 'дня', 'дней', false); // а так получится "дня"

Подстановка данных в шаблон

String.prototype.absorb = function(data) {
    var h = typeof data === 'object';
    var parts = h ? data : arguments;
    return this.replace(/\{(\w+)\}/g, function(s, key) {
        return parts[h ? key : Number(key)];
    });
};

Для того, чтобы подставить данные в шаблон, есть известная функция supplant. Она всем хороша, кроме необходимости передавать эти данные в виде объекта, что не всегда удобно. Поэтому я написал свою функцию, которая может использовать как объект, так и простой набор аргументов.

var template = 'от {from} до {to}';
var data = {from: 'А', to: 'Я'};
template.absorb(data); // удобно, если есть готовый объект
var template = 'от {0} до {1}';
template.absorb('А', 'Я'); // а если объекта нет, можно и так

Диапазон возможных значений

Number.prototype.constrain = function(min, max) {
    var n = this.valueOf();
    return (n < min) ? min : ((n > max) ? max : n);
};
n.constrain(0, 10); // вернёт число от 0 до 10 при любом значении n