我在彼此内部运行了许多.each()
循环,如下所示:
var my_array = [];
$(".btn-submit").click(function(e) {
e.preventDefault();
$(".tab-pane").each(function() {
// add .tab-pane IDs to my_array
$(this).find(".connected").each(function() {
// add .connected IDs to tab-pane array
$(this).find(".ui-state-default").each(function() {
// add .ui-state-default IDs to connected array
});
});
});
$("input[name=my_array").val() = my_array;
$(this).closest("form").submit();
});
在每个.each()
中,我想将ID
元素添加到my_array
,最后嵌套在嵌套在数组内的数组中的数组,并留下一个最终变量,像这样嵌套:
伪代码
my_array (
tab_pane (
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
)
tab_pane (
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
)
tab_pane (
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
connected (
ui-state-default
ui-state-default
ui-state-default
)
)
)
我该如何解决这个问题?
另一个可能澄清事情的基本例子。
考虑以下页面结构。
<div class="tab-pane" id="A">
<ul class="connected" id="1">
<li class="ui-state-default" id="101"></li>
<li class="ui-state-default" id="102"></li>
<li class="ui-state-default" id="103"></li>
</ul>
<ul class="connected" id="2">
<li class="ui-state-default" id="104"></li>
<li class="ui-state-default" id="105"></li>
<li class="ui-state-default" id="106"></li>
</ul>
<ul class="connected" id="3">
<li class="ui-state-default" id="107"></li>
<li class="ui-state-default" id="108"></li>
<li class="ui-state-default" id="109"></li>
</ul>
</div>
<div class="tab-pane" id="B">
<ul class="connected" id="4">
<li class="ui-state-default" id="110"></li>
<li class="ui-state-default" id="111"></li>
<li class="ui-state-default" id="112"></li>
</ul>
<ul class="connected" id="5">
<li class="ui-state-default" id="113"></li>
<li class="ui-state-default" id="114"></li>
<li class="ui-state-default" id="115"></li>
</ul>
<ul class="connected" id="6">
<li class="ui-state-default" id="116"></li>
<li class="ui-state-default" id="117"></li>
<li class="ui-state-default" id="118"></li>
</ul>
</div>
<div class="tab-pane" id="C">
<ul class="connected" id="7">
<li class="ui-state-default" id="119"></li>
<li class="ui-state-default" id="120"></li>
<li class="ui-state-default" id="121"></li>
</ul>
<ul class="connected" id="8">
<li class="ui-state-default" id="122"></li>
<li class="ui-state-default" id="123"></li>
<li class="ui-state-default" id="124"></li>
</ul>
<ul class="connected" id="9">
<li class="ui-state-default" id="125"></li>
<li class="ui-state-default" id="126"></li>
<li class="ui-state-default" id="127"></li>
</ul>
</div>
当我提交表单时,我需要创建一个看起来像这样的数组,所以我可以通过隐藏的输入来发布它:
my_array = array(
"#A" => array(
"#1" => array (
"#101", "#102", "#103"
)
"#2" => array(
"#104", "#105", "#106"
)
"#3" => array(
"#107", "#108", "#109"
)
)
"#B" => array (
...
)
)
答案 0 :(得分:3)
这是一个简单的方法:
function getSelectTree(selection, root){
root = root || document;
var result = {};
for(var i = 0, r = root.querySelectorAll(selection[0]); i < r.length; i++){
if(r.item(i).id){
result[r.item(i).id] = getSelectTree(selection.slice(1), r.item(i));
result[r.item(i).id]['_'] = r.item(i);
}
}
return result;
}
只需使用您要深入查看的订单调用它:
getSelectTree(['.tab-pane','li'])
您将返回Object
,其中键是ID,而_
中的项目本身 - 您可以通过删除result[r.item(i).id]['_'] = r.item(i);
行来省略。
function getSelectTree(selection, root){
root = root || document;
var result = {};
for(var i = 0, r = root.querySelectorAll(selection[0]); i < r.length; i++){
if(r.item(i).id){
result[r.item(i).id] = getSelectTree(selection.slice(1), r.item(i)) || [];
result[r.item(i).id]['_'] = r.item(i);
}
}
return result;
}
var result = getSelectTree(['.tab-pane','.connected','li']);
console.log(result);
document.write(JSON.stringify(result));
&#13;
div { display: none; }
body { font-family: monospace; }
&#13;
<div class="tab-pane" id="A">
<ul class="connected" id="1">
<li class="ui-state-default" id="101"></li>
<li class="ui-state-default" id="102"></li>
<li class="ui-state-default" id="103"></li>
</ul>
<ul class="connected" id="2">
<li class="ui-state-default" id="104"></li>
<li class="ui-state-default" id="105"></li>
<li class="ui-state-default" id="106"></li>
</ul>
<ul class="connected" id="3">
<li class="ui-state-default" id="107"></li>
<li class="ui-state-default" id="108"></li>
<li class="ui-state-default" id="109"></li>
</ul>
</div>
<div class="tab-pane" id="B">
<ul class="connected" id="4">
<li class="ui-state-default" id="110"></li>
<li class="ui-state-default" id="111"></li>
<li class="ui-state-default" id="112"></li>
</ul>
<ul class="connected" id="5">
<li class="ui-state-default" id="113"></li>
<li class="ui-state-default" id="114"></li>
<li class="ui-state-default" id="115"></li>
</ul>
<ul class="connected" id="6">
<li class="ui-state-default" id="116"></li>
<li class="ui-state-default" id="117"></li>
<li class="ui-state-default" id="118"></li>
</ul>
</div>
<div class="tab-pane" id="C">
<ul class="connected" id="7">
<li class="ui-state-default" id="119"></li>
<li class="ui-state-default" id="120"></li>
<li class="ui-state-default" id="121"></li>
</ul>
<ul class="connected" id="8">
<li class="ui-state-default" id="122"></li>
<li class="ui-state-default" id="123"></li>
<li class="ui-state-default" id="124"></li>
</ul>
<ul class="connected" id="9">
<li class="ui-state-default" id="125"></li>
<li class="ui-state-default" id="126"></li>
<li class="ui-state-default" id="127"></li>
</ul>
</div>
&#13;
我们不是将元素存储在ID为关键字的对象中,而是将其作为具有嵌套对象的数组,而嵌套对象又将具有children
数组。这意味着维持订单:
function getSelectTree(selection, root){
root = root || document;
var result = [];
for(var i = 0, r = root.querySelectorAll(selection[0]); i < r.length; i++){
if(r.item(i).id){
result.push({
id: r.item(i).id,
item: r.item(i),
children: getSelectTree(selection.slice(1), r.item(i)),
});
}
}
return result;
}
var result = getSelectTree(['.tab-pane','.connected','li']);
console.log(result);
document.write(JSON.stringify(result));
&#13;
ul { display: none; }
&#13;
<div class="tab-pane" id="A">
<ul class="connected" id="1">
<li class="ui-state-default" id="101"></li>
<li class="ui-state-default" id="102"></li>
<li class="ui-state-default" id="103"></li>
</ul>
<ul class="connected" id="2">
<li class="ui-state-default" id="104"></li>
<li class="ui-state-default" id="105"></li>
<li class="ui-state-default" id="106"></li>
</ul>
<ul class="connected" id="3">
<li class="ui-state-default" id="107"></li>
<li class="ui-state-default" id="108"></li>
<li class="ui-state-default" id="109"></li>
</ul>
</div>
<div class="tab-pane" id="B">
<ul class="connected" id="4">
<li class="ui-state-default" id="110"></li>
<li class="ui-state-default" id="111"></li>
<li class="ui-state-default" id="112"></li>
</ul>
<ul class="connected" id="5">
<li class="ui-state-default" id="113"></li>
<li class="ui-state-default" id="114"></li>
<li class="ui-state-default" id="115"></li>
</ul>
<ul class="connected" id="6">
<li class="ui-state-default" id="116"></li>
<li class="ui-state-default" id="117"></li>
<li class="ui-state-default" id="118"></li>
</ul>
</div>
<div class="tab-pane" id="C">
<ul class="connected" id="7">
<li class="ui-state-default" id="119"></li>
<li class="ui-state-default" id="120"></li>
<li class="ui-state-default" id="121"></li>
</ul>
<ul class="connected" id="8">
<li class="ui-state-default" id="122"></li>
<li class="ui-state-default" id="123"></li>
<li class="ui-state-default" id="124"></li>
</ul>
<ul class="connected" id="9">
<li class="ui-state-default" id="125"></li>
<li class="ui-state-default" id="126"></li>
<li class="ui-state-default" id="127"></li>
</ul>
</div>
&#13;
答案 1 :(得分:1)
这样的事情会让你开始
var data = []; // final data array
$(".tab-pane").each(function () {
var paneObj = createElObj(this);
data.push(paneObj);
$(this).find(".connected").each(function () {
var listObj = createElObj(this);
paneObj.children.push(listObj);
$(this).find(".ui-state-default").each(function () {
listObj.children.push(createElObj(this));
});
});
});
function createElObj(el) {
return {
id: el.id,
tag: el.tagName,
cls: $(el).attr('class'),
children: []
}
}
如果你需要更深入的话,可以很容易地适应更多的递归
的 DEMO 强>