Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   RecursiveIterator / Рекурсивный итератор (https://javascript.ru/forum/project/54054-recursiveiterator-rekursivnyjj-iterator.html)

nerv_ 01.03.2015 22:17

RecursiveIterator / Рекурсивный итератор
 
В продолжении темы Object.traverse() запилил рекурсивный итератор.

https://github.com/nervgh/recursive-iterator

Можно использовать как в ES5, так и в ES6 окружениях.
При использовании в ES6:
- поддерживает ES6 итерационные протоколы
- совместим с for...of циклом

Пример на es6:
var root = {
    object: {
        number: 1
    },
    string: 'foo'
};

for(let item of new RecursiveIterator(root)) {
    console.log(item.path.join('.'), item.node);
}

// or

for(let {parent, node, key, path, deep} of new RecursiveIterator(root)) {
    console.log(path.join('.'), node);
}

// or

for(let {node, path} of new RecursiveIterator(root, 1)) {
    console.log(path.join('.'), node);
}

Больше инфы здесь

Теги: js, javascript, walk, walker, recursive, recursion, iterator, iteratate, traverse, traversing, object, tree, json

nerv_ 04.03.2015 11:55

Обновил до версии 1.0.0.

- произведен глобальный рефакторинг в результате которого, инератор стал проще, читабельней и, надеюсь, быстрее
- введен параметр максимальной глубины погружения
- добавлены и описаны в документации методы
- добавлен коллбек onStepInto(), который позволяет гибко управлять обходом объектов
- возможность изменения объектов на месте
- больше тестов

kobezzza 04.03.2015 12:02

Можно использовать совместно с Collection, включая потоки :)

$C(new RecursiveIterator(root)).get({
  use: 'for of',
  thread: true,
  filter: 'someFilter1 && !someFilter2'
}).onComplete = function (data) {
  ...
};


:)

nerv_ 04.03.2015 18:22

Цитата:

Сообщение от kobezzza
Можно использовать совместно с Collection

круто :)

А разве Collection сам не может "рекурсивно" перебирать объекты?

melky 04.03.2015 18:44

Цитата:

Сообщение от nerv_
- больше тестов

покрытие ? :)

nerv_ 04.03.2015 19:49

Цитата:

Сообщение от melky
покрытие ?

Если речь идет о проценте покрытия, то я не знаю как его считать. Думаю, 70-80.
У kobezzza в coverage в collection заявлен процент 73. Любопытно, как он его получил :)

kobezzza 04.03.2015 21:27

Цитата:

А разве Collection сам не может "рекурсивно" перебирать объекты
Коробочных механизмов обхода деревьев нет, т.е. чтобы сделать это нужно явно задать рекурсию, например рекурсивный reduce, и т.д. или использовать итератор в качестве данных (как в твоём случае).

Цитата:

У kobezzza в coverage в collection заявлен процент 73. Любопытно, как он его получил
На самом деле где-то 85%, просто лень было PhantomJS заряжать для тестов. Покрытие оценивается библиотекой Istanbul, но следует заметить, что это покрытие кода, а не вариантов его использования. Сейчас в Collection около 1.5к тестов.

melky 04.03.2015 23:06

Цитата:

Сообщение от kobezzza
На самом деле где-то 85%, просто лень было PhantomJS заряжать для тестов. Покрытие оценивается библиотекой Istanbul, но следует заметить, что это покрытие кода, а не вариантов его использования. Сейчас в Collection около 1.5к тестов.

для ES6 я пользуюсь isparta... istanbul не умеет ES6 инструментировать

kobezzza 05.03.2015 00:29

Цитата:

Сообщение от melky (Сообщение 359645)
для ES6 я пользуюсь isparta... istanbul не умеет ES6 инструментировать

А у меня babel + istanbul, а isparta тоже включает транслятор что ли?

upd: глянул доку, так и есть - это просто istanbul + babel :)

nerv_ 05.03.2015 11:41

Цитата:

Сообщение от kobezzza
Коробочных механизмов обхода деревьев нет

кажется, я понял почему :)

kobezzza, зарегай свои наработки в npm & bower для продвижения (если еще этого не сделал.) и напиши про это в readme


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