Pull to refresh

Underscore.js — библиотека, которая так хороша, что должна быть вне закона

Reading time 3 min
Views 49K
Каждый, кому приходилось писать объемные куски осмысленного кода на javascript, рано или поздно понимал, что ему многого не хватает в этом языке или просто неудобны некоторые врожденные конструкции. Для сглаживания шероховатостей применяются jQuery, Prototype, MooTools etc. Кто-то уже мало представляет себе, как можно кодить без них. Сегодня я расскажу о еще одной маааленькой библиотечке, которая делает мир javascript-программиста еще прекраснее. Речь пойдет о Underscore.js

Underscore.js или просто _.js — это набор функций-утилит, к которым привыкли любители функционального программированя, Ruby, Python или Prototype.js (но, в отличие от Prototype эта библиотека не расширяет базовые классы JavaScript). Она была написана, чтобы хорошо уживаться с jQuery.
Underscore.js предоставляет более 60 функций. Часть из них рассчитана на любителей map-reduce, другая — специальные вспомогательный функции для javascript. Библиотека умеет делегировать вызовы, если какая-то функциональность реализована разработчиками браузеров.

Вот список функций, который в ней реализован и примеры из официальной документации:

Работа с коллекциями
each, map, reduce, reduceRight, detect, select, reject, all, any, include, invoke, pluck, max, min, sortBy, sortedIndex, toArray, size
Примеры
// Map & Reduce
_.map([1, 2, 3], function(num){ return num * 3 }); // => [3, 6, 9]
var sum = _.reduce([1, 2, 3], 0, function(memo, num){ return memo + num }); // => 6
// Любой из элементов массива true
_.any([null, 0, 'yes', false]); //=> true
// Все элементы массива true
_.all([true, 1, null, 'yes']); // => false
// Вытаскиваем массив значений по ключу
var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}];
_.pluck(stooges, 'name'); // => ["moe", "larry"]


Работа с массивами
first, rest, last, compact, flatten, without, uniq, intersect, zip, indexOf, lastIndexOf, range
Примеры
// Первый элемент массива
_.first([5, 4, 3, 2, 1]); // => 5
// Последний элемент массива
_.last([5, 4, 3, 2, 1]); // => 1
// Убрать неугодные элементы
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4]
// Оставить только уникальные элементы
_.uniq([1, 2, 1, 3, 1, 4]); // => [1, 2, 3, 4]


Работа с функциями
bind, bindAll, memoize, delay, defer, wrap, compose
Примеры
// Кэшируем результаты вычислений функции
var fibonacci = function(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
};
var fastFibonacci = _.memoize(fibonacci);


Работа с объектами
keys, values, functions, extend, clone, tap, isEqual, isEmpty, isElement, isArray, isArguments, isFunction, isString, isNumber, isBoolean, isDate, isRegExp isNaN, isNull, isUndefined
Примеры
// Вытащить имена свойств
_.keys({one : 1, two : 2, three : 3}); // => ["one", "two", "three"]
// Вытащить значения свойств
_.values({one : 1, two : 2, three : 3}); // => [1, 2, 3]
// Копируем свойства одного объекта в другой
_.extend({name : 'moe'}, {age : 50}); // => {name : 'moe', age : 50}


Утилиты
noConflict, identity, times, breakLoop, mixin, uniqueId, template
Примеры
// Удобно и привычно
_(5).times(function(){ console.log('Odelay!"); });


Для последовательных вызовов
chain, value

Названия говорят сами за себя. Документацию можно найти здесь, там очень хорошие и понятные примеры. Я думаю, что даже незнание английского никого не остановит. Но если есть большая потребность, то можно перевести на русский.
Стоит добавить, что в сжатом виде библиотека весит 2.9кб, а исходники лежат на GitHub.

Upd. Добавил немного примеров.
Tags:
Hubs:
+149
Comments 51
Comments Comments 51

Articles