jquery - jQuery: Move list items based on attribute matches
问题描述
I am building out a hierarchical menu that consists of 6 Categories (at the top level) and perhaps 50 total Sections (as children). The data for the menu comes from 2 separate JSON files -- one for the Categories and one for the Sections. AJAX calls retrieve the data and dump it to 2 separate UL lists in my HTML: one list for the Categories and one for the Sections.
I need a programmatic way to move the Section list items so that each one sits just after the Category list item that is its parent. As the sample code below helps to illustrate, Section list items pair up with a particular Category list item based on a comparison of attribute values. More specifically, when the categoryid
of a Section list item matches the catid
of a Category list item, that Section list item 'belongs' to that Category and should be moved so that it sits (as a sibling) just after the Category.
<ul id="categories">
<ul class="category"><li class="cat" catid="360002246652"><a>Category1</a></li></ul>
<ul class="category"><li class="cat" catid="360002246672"><a>Category2</a></li></ul>
<ul class="category"><li class="cat" catid="360002254991"><a>Category3</a></li></ul>
<ul class="category"><li class="cat" catid="360002255011"><a>Category4</a></li></ul>
<ul class="category"><li class="cat" catid="360002255031"><a>Category5</a></li></ul>
<ul class="category"><li class="cat" catid="360002255051"><a>Category6</a></li></ul>
</ul>
<ul id="sections">
<ul class="section"><li class="sec" secid="360008584672" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1a</a></li></ul>
<ul class="section"><li class="sec" secid="360007912231" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1b</a></li></ul>
<ul class="section"><li class="sec" secid="360007060252" categoryid="360002254991" parentsecid="null"><a href="https://MyURL">Section3a</a></li></ul>
<ul class="section"><li class="sec" secid="360007106591" categoryid="360002254991" parentsecid="null"><a href="https://MyURL">Section3b</a></li></ul>
</ul>
Once the move has been executed, the structure for each Category should look like the sample code below. As you can see, the first list item is the Category (class = 'cat'
), and the subsequent items are the corresponding Sections (class = 'sec'
) that fall under that Category:
<ul class="category">
<li class="cat" catid="360002246652"><a>Category1</a></li>
<li class="sec" secid="360007912231" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1a</a></li>
<li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1b</a></li>
<li class="sec" secid="360007106191" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1c</a></li>
<li class="sec" secid="360007106171" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1d</a></li>
</ul>
Here is an attempt at the code. No errors show up in the console, but the migration of list items does not take place:
var catid = $("li.cat['catid']");
$("ul.section li.sec['categoryid']").each(function() {
if ($(this) == catid) {
$(this).insertAfter(catid);
}
});
Thanks in advance for any feedback you can provide on this.
解决方案
You can do it like this:
$(".sec").each(function() {
let catid = $(this).attr("categoryid");
$(".cat").each(function() {
if ($(this).attr("catid") == catid) {
$(this).after($("li.sec[categoryid=" + catid + "]"));
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="categories">
<ul class="category">
<li class="cat" catid="360002246652"><a>Category1</a></li>
</ul>
<ul class="category">
<li class="cat" catid="360002246672"><a>Category2</a></li>
</ul>
<ul class="category">
<li class="cat" catid="360002254991"><a>Category3</a></li>
</ul>
<ul class="category">
<li class="cat" catid="360002255011"><a>Category4</a></li>
</ul>
<ul class="category">
<li class="cat" catid="360002255031"><a>Category5</a></li>
</ul>
<ul class="category">
<li class="cat" catid="360002255051"><a>Category6</a></li>
</ul>
</ul>
<ul id="sections">
<ul class="section">
<li class="sec" secid="360008584672" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1a</a></li>
</ul>
<ul class="section">
<li class="sec" secid="360007912231" categoryid="360002246652" parentsecid="null"><a href="https://MyURL">Section1b</a></li>
</ul>
<ul class="section">
<li class="sec" secid="360007060252" categoryid="360002254991" parentsecid="null"><a href="https://MyURL">Section3a</a></li>
</ul>
<ul class="section">
<li class="sec" secid="360007106591" categoryid="360002254991" parentsecid="null"><a href="https://MyURL">Section3b</a></li>
</ul>
</ul>
推荐阅读
- selenium - Selenium 循环,表格缺少第一行和最后一列
- c# - 如何在 .NET 的控制器中支持作为 formbody 的继承?
- java - 在 NetBens 中使用 addDateEvaluator() 方法后如何启用 JCalendar 按钮?
- flutter - Flutter:我们在哪里可以使用线性渐变而不是容器
- flutter - 使用 Riverpod 时可以保存全局 ref 对象吗
- javascript - 反应路由器 v6 在组件之外导航
- python - Python:局部函数中的全局变量可能吗?
- java - 在 Spring Boot jpa 中存储日期的最佳方法是什么?
- c# - 在 MongoDB 5.0 中过滤基于时间的数据,c# 驱动程序:得到错误(零)结果
- python - 如何通过比较两个对象的函数的结果对对象列表进行分组?