Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
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
- удалено несколько лишних вычислений на этапе инициализации (создание итератора теперь обходиться очень дешево) - переименовано пару методов (дабы внести очевидность); изменены аргументы одного метода (объект вместо списка) Апи почти стабилизировалось :) - добавлены примеры реализации алгоритмов неинформированного поиска на базе рекурсивного итератора |
Часовой пояс GMT +3, время: 06:39. |