Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Collection v5 (https://javascript.ru/forum/project/47717-collection-v5.html)

kobezzza 09.06.2014 23:43

Цитата:

Сообщение от monolithed (Сообщение 315800)
А как же принцип "Не плати за то что не используешь"?

Это ща к чему? Есть модульная сборка, можно сделать свой билд. Скорость работы либы такая же, как если бы всё хардкодить на циклах, т.е. опять таки никаких переплат, а вот профит очевиден.

Да и максимальная сборка либы - это всего 16 килобайт, объём такой же как и у underscore, а функционал несоизмеримо больше, а про скорость я вообще молчу.

В общем на JavaScript.ru как обычно: "описание не читал, но по любому не нужон" :)

monolithed 10.06.2014 00:17

Цитата:

Сообщение от kobezzza
В общем на JavaScript.ru как обычно: "описание не читал, но по любому не нужон"

Да нет, слежу с первой версии... просто пока не могу понять где бы эта либа пригодилась в моей работе :)

kobezzza 10.06.2014 00:24

Цитата:

Сообщение от monolithed (Сообщение 315810)
Да нет, слежу с первой версии... просто пока не могу понять где бы эта либа была полезна :)

Ты не мог следить с первой версии, т.к. первая публикация была с 3-й :)

Эта либа общего назначения, т.е. использовать её можно везде, все мои проекты (кроме Snakeskin, т.к. только в 5-й версии был добавлен механизм "контекста forEach") используют Collection. Одно "но", чтобы писать на Collection нужно любить функциональщину, т.е. не шарахаться от map / reduce и прочего, т.к. либа явно декларирует именно такой подход.

Пример, функция которая преобразовывает dash-style в camelCase

String.prototype.convertDashStyleToCamelCase = function () {
    return $C(this).reduce(function (res, el) {
        if (el !== '-') {
            res += this.$.up ? el.toUpperCase() : el;
        }

        this.$.up = el === '-';
        return res;
    
    }, '');
};


Обратная операция

String.prototype.convertCamelCaseToDashStyle = function () {
    return $C(this).reduce(function (res, el) {
        var lc = el.toLowerCase();
        return res + (el !== lc ? '-' : '') + lc;
    }, '');
};


Отбор элементов для пагинации

$C(...).forEach(function (el) {
        ...
    
}, {startIndex: 10, count: 10});


Тоже самое, но в обратном порядке

$C(...).forEach(function (el) {
        ...
    
}, {startIndex: 10, count: 10, reverse: true});


Количество вхождений каждого символа в строке

$C('fooobar1212').group(el => el)


Количество вхождений буквы 'o' в строке

$C('fooobar1212').length(el => el == 'o')


Преобразовать объект {ключ: значение} в Set из значений, которые больше 1


$C({a: 1, b: 2, c: 3}).map(el => el, {initial: new Set, filter: el => el > 1})


При этом не важно, что мы итерируем, хоть массив, объект, Map, Set, генератор, строку и т.д. все методы работают одинаково и со скоростью циклов, но в сахарном функциональном виде.

Примеров можно сделать уйму, но достаточно взглянуть на методы: https://github.com/kobezzza/Collection/wiki

kobezzza 10.06.2014 14:04

Написал короткую описательную статейку на хабр

monolithed 10.06.2014 15:08

Цитата:

Сообщение от kobezzza
Ты не мог следить с первой версии, т.к. первая публикация была с 3-й

Ага, спиздел. Короче с первой статьи на хабре :)

melky 10.06.2014 19:54

Цитата:

Сообщение от kobezzza
чтобы писать на Collection нужно любить функциональщину, т.е. не шарахаться от map / reduce и прочего, т.к. либа явно декларирует именно такой подход.

вот у меня появилась мысль форкнуть LiveScript и примешать туда $C

т.е. пишем на обычном LS завёрнутую конструкцию, а это дело разворачивается в один вызов $C

без всяких "var $C = require("Collection")"

kobezzza 10.06.2014 19:59

Цитата:

Сообщение от melky (Сообщение 315987)
вот у меня появилась мысль форкнуть LiveScript и примешать туда $C

Гм, мне кажется это слишком сурово, т.е. ты хочешь на уровне синтаксиса интеграцию сделать?)

Цитата:

Сообщение от melky (Сообщение 315987)
без всяких "var $C = require("Collection")"

Я делаю так (в ноде): в файле конфига пишу

var collection = require("collection.js");

global.$C = collection.$C;
global.Collection = collection.Collection;


И всё, можно нигде больше не кидать require :)

PS: следует заметить, что я не против require, просто в случае с Collection его нужно подключать везде и это утомляет :)

melky 10.06.2014 20:04

Цитата:

Сообщение от kobezzza
Гм, мне кажется это слишком сурово, т.е. ты хочешь на уровне синтаксиса интеграцию сделать?)

да.

хотя...

спад производительности почти незаметен в LS... а если нужны производительные части, можно вызвать $C )

Цитата:

Сообщение от kobezzza
Я делаю так (в ноде): в файле конфига пишу

точно! забыл про глобали

kobezzza 10.06.2014 20:11

Цитата:

спад производительности почти незаметен в LS... а если нужны производительные части, можно вызвать $C
Странный подход, не спорю, что Collection быстрый, но это не главное, как мне кажется :)

Я то хотел сделать единое навороченное функциональное АПИ для всех видов итерируемых данных :)

kobezzza 10.06.2014 22:22

Выпустил микроапдейт: 5.0.1.


Часовой пояс GMT +3, время: 05:17.