javascript - 递归 JQuery 以在文本中格式化 HTML 节点值

标签 javascript loops recursion

function insideNest(theindex, count) {
  count++;
  console.log("(\n)");
  if (theindex == null) {
    theindex = $(document);
  }
  $(theindex).children("#nest").each(function() {
    $(this).children("#value").each(function() {
      $(this).children("input").each(function() {
        for (i = 0; i < count; i++) {
          console.log("\t");
        }
        console.log($(this).val() + "\n");
      });
    });
    insideNest($(this));
  });
  console.log(")\n)");
}
$(document).ready(function() {
  insideNest($(this), -1);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="nest">
  <div id="value">
    <input type="text" id="hasvalue" value="level1" />
  </div>
  <div id="value">
    <input type="text" id="hasvalue" value="level1" />
  </div>
  <div id="value">
    <input type="text" id="hasvalue" value="level1" />
  </div>
  <div id="nest">
    <div id="value">
      <input type="text" id="hasvalue" value="level2" />
    </div>
    <div id="value">
      <input type="text" id="hasvalue" value="level2" />
    </div>
    <div id="nest">
      <div id="value">
        <input type="text" id="hasvalue" value="level3" />
      </div>
    </div>
    <div id="value">
      <input type="text" id="hasvalue" value="level2" />
    </div>
  </div>
  <div id="value">
    <input type="text" id="hasvalue" value="level1" />
  </div>
  <div id="value">
    <input type="text" id="hasvalue" value="level1" />
  </div>
</div>

我的输出:

(
)
)
)

预期输出:

level1
level1
level1
(
  level2
  level2
  (
    level3
  )
  level2
)
level1
level1

我想获取 input 字段中的值,并且括号仅在嵌套 #nest 时才开始。我尝试在 javascript 找到 #nest 时调用相同的函数,并在找到 #value 时打印输出。我认为诀窍是只找到 nest 的一级 child fiddle :https://jsfiddle.net/2fq8u8wk/

最佳答案

我不知道您的错误的确切性质,因为我不想尝试分析 jQuery 的行为方式。

相反,重写更容易。这是一个简单的递归函数,它使用 native API 来执行您想要的操作。

function indent(n) { return "\t".repeat(n) }
function print(depth, s) { console.log(indent(depth) + s) }

function walk(root, depth) {
  print(depth, "(")
  
  for (const ch of root.children) {
    if (ch.matches(".value")) {
      print(depth + 1, ch.firstElementChild.value)

    } else if (ch.matches(".nest")) {
      walk(ch, depth + 1)
    }
  }
  print(depth, ")")
}

// Run after the DOM is loaded
document.addEventListener("DOMContentLoaded", function() {
  walk(document.body.querySelector(".nest"), 0)
})
<div class="nest">
  <div class="value">
    <input type="text" class="hasvalue" value="level1" />
  </div>
  <div class="value">
    <input type="text" class="hasvalue" value="level1" />
  </div>
  <div class="value">
    <input type="text" class="hasvalue" value="level1" />
  </div>
  <div class="nest">
    <div class="value">
      <input type="text" class="hasvalue" value="level2" />
    </div>
    <div class="value">
      <input type="text" class="hasvalue" value="level2" />
    </div>
    <div class="nest">
      <div class="value">
        <input type="text" class="hasvalue" value="level3" />
      </div>
    </div>
    <div class="value">
      <input type="text" class="hasvalue" value="level2" />
    </div>
  </div>
  <div class="value">
    <input type="text" class="hasvalue" value="level1" />
  </div>
  <div class="value">
    <input type="text" class="hasvalue" value="level1" />
  </div>
</div>

我确实将您的 id 属性更改为 class,因为 ID 在文档中应该是唯一的。鉴于我上面的重写,我们可以摆脱 ID,但它仍然不是很好。

关于javascript - 递归 JQuery 以在文本中格式化 HTML 节点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047791/

相关文章:

javascript - 一个可以在 Javascript 中组合和链接(点符号)的函数

php - 如何激活循环选项卡 PHP

java - java中的阶乘递归 "visualized"

algorithm - 最大化给定股票报价的利润

c - 在 C 中对 char 数组进行操作的递归函数中的段错误

javascript - 为什么 console.log 在 .each 中不起作用?

javascript - 对象数组之间的区别

javascript - 取决于媒体查询的通用参数

javascript - 在给定大于数组的偏移量的情况下,向前或向后无缝循环数组

java - 为什么这个循环过程需要这么长时间?