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 |
Обновил до версии 1.0.0.
- произведен глобальный рефакторинг в результате которого, инератор стал проще, читабельней и, надеюсь, быстрее - введен параметр максимальной глубины погружения - добавлены и описаны в документации методы - добавлен коллбек onStepInto(), который позволяет гибко управлять обходом объектов - возможность изменения объектов на месте - больше тестов |
Можно использовать совместно с Collection, включая потоки :)
$C(new RecursiveIterator(root)).get({
use: 'for of',
thread: true,
filter: 'someFilter1 && !someFilter2'
}).onComplete = function (data) {
...
};
:) |
Цитата:
А разве Collection сам не может "рекурсивно" перебирать объекты? |
Цитата:
|
Цитата:
У kobezzza в coverage в collection заявлен процент 73. Любопытно, как он его получил :) |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
upd: глянул доку, так и есть - это просто istanbul + babel :) |
Цитата:
kobezzza, зарегай свои наработки в npm & bower для продвижения (если еще этого не сделал.) и напиши про это в readme |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
http://javascript.ru/forum/project/5...er-loader.html |
Что там есть. Но я ничего не понял. Попроще для таких как я(слесарь ремонтник больших металлорежущиж станков).
|
Упрощенный пример глубокого копирования (клонирования) объекта (он же в песоцнице):
var toString = Object.prototype.toString;
var isObject = RecursiveIterator.isObject;
/**
* @param {*} any
* @returns {String}
*/
function getType(any) {
return toString.call(any).slice(8, -1);
}
/**
* @param {*} any
* @returns {*}
*/
function shallowCopy(any) {
var type = getType(any);
switch (type) {
case 'Object':
return {};
case 'Array':
return [];
case 'Date':
return new Date(any);
case 'RegExp':
return new RegExp(any);
case 'Number':
case 'String':
case 'Boolean':
case 'Undefined':
case 'Null':
return any;
default:
return any.toString();
}
}
/**
* @param {*} any
* @param {Boolean} [deep]
* @returns {*}
*/
function copy(any, deep = false) {
if (!deep || !isObject(any)) {
return shallowCopy(any);
}
var map = new Map();
var rootNode = shallowCopy(any);
map.set(any, rootNode);
for(var {parent, node, key} of new RecursiveIterator(any, 1, true)) {
var parentNode = map.get(parent);
var cloneNode = shallowCopy(node);
parentNode[key] = cloneNode;
map.set(node, cloneNode);
}
map.clear();
return rootNode;
}
// ---------------------------------
// USAGE
// ---------------------------------
var some = {
foo: {
bar: 1
}
};
var clone = copy(some, true);
alert(JSON.stringify(clone));
alert(clone === some);
Если немного настроить, можно задавать глубину копирования, копировать с циклическими ссылками и пр. |
Превращаем рекурсивный итератор в простой итератор :)
import RecursiveIterator from 'your_path';
class Iterator extends RecursiveIterator {
constructor(iterable) {
super(iterable, 1, false, 1);
}
}
итерируем
import Iterator from 'your_path';
for(let {node, key} of new Iterator([1, 2, 3])) {
console.log(node);
}
for(let {node, key} of new Iterator(document.getElementsByTagName('h1'))) {
console.log(node, key);
}
|
Обновил до версии 1.3
* еще больше сжатия в min версии * утилиты вынесены в отдельные модули * добавлена карта документации (сама дока переехала в вики) * добавлена книга рецептов Отдельно хотелось бы сказать про рецепт DomIterator, который показывает, как на основе {RecursiveIterator} создавать любой необходимый вам итератор, подтверждая простоту, лаконичность и расширяемость {RecursiveIterator} :) |
nerv_,
:thanks: |
Обновил до версии 2.0
- удалено несколько лишних вычислений на этапе инициализации (создание итератора теперь обходиться очень дешево) - переименовано пару методов (дабы внести очевидность); изменены аргументы одного метода (объект вместо списка) Апи почти стабилизировалось :) - добавлены примеры реализации алгоритмов неинформированного поиска на базе рекурсивного итератора |
Игра "восемь"
Решение головоломки "восемь" (как пятнашки, только матрица 3x3) с помощью эвристического поиска на базе рекурсивного итератора http://jsfiddle.net/uoskm6bq/9/
Для визаулизации применяется Vue.js & Bootstrap.css По идее, должно работать и для пятнашек, не проверял :) Исходники |
To Query String
Добавлен рецепт конвертации объекта/массива в строку запроса
|
Два года почти прошло :)
Любопытства ради решил взглянуть на статистку в npm: Цитата:
На самом деле все просто: это низкоуровневый пакет (если можно так выразится), который другие разработчики используют в своих проектах. Как и задумывалось изначально. До сих пор считаю его далеко не идаельным. Но, если бы я держал его всё это время в загашнике, то он в принципе бы не увидел свет) |
nerv_,
:thanks: |
Цитата:
Цитата:
|
| Часовой пояс GMT +3, время: 14:23. |