Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Разверните эту рекурсию в цикл) (https://javascript.ru/forum/offtopic/38243-razvernite-ehtu-rekursiyu-v-cikl.html)

megaupload 24.05.2013 15:48

Разверните эту рекурсию в цикл)
 
function rec(element) {

  // делаем что-то с элементом, например
  alert(element);

  var children = element.children;
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    rec(child)
  }
}


rec(document.body);

megaupload 24.05.2013 16:30

наркоман, надо не все ноды а только не текстовые) можешь так)?


п.с. да и вообще тут проблема не конкретная, я просто пример привел, мне интересно как разворачивать рекурсию с циклом в цикл О__О

где ставить брейки и.т.п.


я вот чо-то такое начал пилить


function rec(elem) {

  var stark = [elem];

  while (stark.length) {

    var element = stark[stark.length - 1];
    
    // делаем что-то с элементом, например
    alert(element);

    var children = element.children;
    for (var i = 0; i < children.length; i++) {
      var child = children[i];
      rec(child)
    }

  }

}


rec(document.body);

megaupload 24.05.2013 17:03

Хорошо, вот у меня есть функция которая ищет виджеты одного модуля внутри него, я бы хотел для ускорения её работы развернуть рекурсию в цикл, но я слишком плохой программист для этого, может ты справишься? или это слишком сложно для тебя чтобы сделать это бесплатно?

function findWidgets(moduleElement, moduleName) {
    var widgets = {};

    findIn(moduleElement);

    function findIn(element) {
      var children = element.children;

      for (var i = 0; i < children.length; i++) {
        var child = children[i];
        var uiAttr = child.getAttribute('ui');
        var regExp = new RegExp(moduleName + ':(\\w+)');

        if (uiAttr === moduleName) continue;

        if (uiAttr && regExp.test(uiAttr)) {
          var widgetName = regExp.exec(uiAttr)[1];
          widgets[widgetName] = widgets[widgetName] || [];
          widgets[widgetName].push(child);
        }

        findIn(child);
      }
    }

    return widgets;
  }


напомню

megaupload 24.05.2013 17:34

зараза, что ж тебя ни что не берет то.... ок, придумаю чо нить посложнее

mta88 24.05.2013 18:23

function traverse(el) {
  var stack = [el];
  var current;
  
  while (stack.length > 0) {
    current = stack.pop();
    var len = current.children.length;
    for (var i=0; i < len; i++) {
      stack.push(current.children[len-1-i]);
    }
    
    alert(current);
  }
}

traverse(document.body);

как-то так наверно проще будет если порядок обхода важен


а если не важен, можно
stack.push(current.children[i]);
вместо
stack.push(current.children[len-1-i]);

megaupload 24.05.2013 18:29

mta88, О___________О

kobezzza 24.05.2013 19:22

function rec(element) {
	var stack = [],
		children = element.children;
		
	for (var i = 0; i <= children.length; i++) {
		var child = children[i];
		
		if (child) {
			// Тут делаем наше действие
			console.log(child);
		
			if (child.children) {
				stack.push({
					i: i,
					children: children
				});
				
				children = child.children;
				i = -1;
				continue;
			}
		}
		
		if (stack.length) {
			var last = stack[stack.length - 1];
		
			children = last.children;
			i = last.i;
			
			stack.pop();
		}
	}
}

megaupload 24.05.2013 19:25

kobezzza, о во, бро пришел, помоги разработать концепции)?

kobezzza 24.05.2013 19:29

megaupload, мм, ты про это Проблема с Юраксом, помогите. ?

megaupload 24.05.2013 19:30

<script src="http://yourjavascript.com/1544031232/fix.js"></script>
<script src="http://yourjavascript.com/22012057349/ui.js"></script>

<body ui="app">

<style type="text/css">
  .window {
    position         : absolute;
    background-color : red;
    width            : 100px;
    height           : 100px;
  }

  .header {
    background-color : cornflowerblue;
    cursor           : pointer;
  }

</style>

<div ui="window" class="window">
  <h1 ui="window:title" class="header">окно 1</h1>
  <button ui="window:close">закрыть</button>
</div>


<div ui="window" class="window">
  <h3 ui="window:title" class="header">окно 2</h3>
  <button ui="window:close">закрыть</button>

  <div ui="chat">
    <div ui="chat:post"></div>
    <input ui="chat:input">
  </div>
</div>


<div ui="window" class="window">
  <h1 ui="window:title" class="header">окно 3</h1>
  <button ui="window:close">закрыть</button>
</div>


</body>


Короче как-то так, норм идея?


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