Javascript 使用字符串键访问数组
我从JSON对象Javascript 使用字符串键访问数组,javascript,arrays,string,append,appendchild,Javascript,Arrays,String,Append,Appendchild,我从JSON对象tableobj生成html元素,并通过generate()函数将它们分配给数组elementArray,这非常有效,但问题是,当我将elementArray传递给assembly()函数时,我得到以下错误 未捕获的TypeError:无法读取未定义的属性“appendChild” 我想要的是让assemble()的输出构造表,它基于binding属性 例如:将追加到中,因此的绑定将是0,因为其父元素是元素数组[0],这将是。的相同模式将是00,因为它将是子元素0,而子元素将是,
tableobj
生成html元素,并通过generate()
函数将它们分配给数组elementArray
,这非常有效,但问题是,当我将elementArray
传递给assembly()
函数时,我得到以下错误
未捕获的TypeError:无法读取未定义的属性“appendChild”
我想要的是让assemble()
的输出构造表,它基于binding
属性
例如:将
追加到
中,因此
的绑定将是0,因为其父元素是元素数组[0]
,这将是
。
的相同模式将是00,因为它将是
子元素0
,而子元素将是
,等等
//代码
<script>
var tableobj = [
{table:{binding:""}},
{thead:{binding:"0"}},
{tbody:{binding:"0"}},
{tr:{binding:"00"}},
{th:{binding:"000"}},
{th:{binding:"000"}},
{th:{binding:"000"}}
];
function init(){
//GENERATE HTML & BIND PROPERTIES
var elementArray = generate(tableobj);
console.log(elementArray);
//ASSEMBLE THE TABLE --- example: elementArray[0].appendChild(thead)
var elementAssembly = assemble(elementArray);
console.log(elementAssembly);
console.log(elementAssembly[0]);
//OUTPUT
//TABlE->THEAD
//TABlE->THEAD
//TABlE->THEAD->TR
//TABlE->THEAD->TR->TH
//TABlE->THEAD->TR->TH
//TABlE->THEAD->TR->TH
}
function assemble(o){
o.forEach(function(ele){
var position = ele.position.replace(/0/g,"[0]");
var position = ele.position.split('');
if(ele.position.length > 0){
//WHERE MY QUESTION LIES....
var parent = o[position];
parent.appendChild(ele);
}
});
return o;
};
function generate(o){
var struct = o.map(function(ele,i){
var element = document.createElement(Object.keys(ele));
for(prop in ele){
var key = Object.keys(ele[prop]);
key.forEach(function(attr){
switch(attr){
case "binding":
Object.defineProperty(element,'position',{
value: ele[prop][attr]
});
break;
}
});
}
return element;
})
return struct;
}
//ONLOAD TRIGGER INIT
document.addEventListener('DOMContentLoaded', init);
</script>
变量tableobj=[
{表:{绑定:'}},
{thead:{绑定:“0”},
{tbody:{绑定:“0”},
{tr:{binding:'00}},
{th:{binding:'000}},
{th:{binding:'000}},
{th:{绑定:“000”}
];
函数init(){
//生成HTML&绑定属性
var elementArray=generate(tableobj);
log(elementArray);
//组装表---示例:elementArray[0].appendChild(thead)
var elementAssembly=assembly(elementArray);
控制台日志(elementAssembly);
console.log(elementAssembly[0]);
//输出
//表->THEAD
//表->THEAD
//表->磁带->磁带
//表格->主题->主题->主题->主题
//表格->主题->主题->主题->主题
//表格->主题->主题->主题->主题
}
函数汇编(o){
o、 forEach(功能(ele){
变量位置=元件位置替换(/0/g,“[0]”);
变量位置=元件位置拆分(“”);
如果(ele.position.length>0){
//我的问题在哪里。。。。
var parent=o[位置];
父母、子女(ele);
}
});
返回o;
};
函数生成(o){
var struct=o.map(函数(ele,i){
var元素=document.createElement(Object.keys(ele));
用于(ele中的支柱){
var key=Object.key(ele[prop]);
key.forEach(函数(attr){
开关(attr){
案例“绑定”:
Object.defineProperty(元素,'position'{
值:ele[prop][attr]
});
打破
}
});
}
返回元素;
})
返回结构;
}
//加载触发器初始化
document.addEventListener('DOMContentLoaded',init);
我相信我了解您想要实现的目标:
取以下字符串和数组
var str = "[0][0]";
var arr = [["a"], ["b"]];
eval("arr" + str);
=> "a"
在这里,您已经根据动态字符串将其放入数组中
此评估的等效代码为:
arr[0][0];
循环绑定中的字符,获取每个字符的子元素以深入到DOM中。在结束时,将新元素作为子元素追加
function assemble(o){
o.forEach(function(ele){
var position = ele.position;
if (position.length == 0) {
return;
}
var cur = o[0];
for (var i = 1; i < position.length; i++) {
cur = cur.children[position[i]];
}
cur.appendChild(ele);
});
}
函数汇编(o){
o、 forEach(功能(ele){
var位置=电气位置;
如果(position.length==0){
返回;
}
var cur=o[0];
对于(变量i=1;i
也许你在找这个。它使用给定的路径作为数组code
的索引
var path='[0][0][0]',
代码=[];
函数setValue(数组、路径、值){
var pathA=path.match(/\d+/g),
index=pathA.pop();//保存最后一个索引以供访问
路径还原(函数(r,a){
如果(!(r中的a)){
r[a]=[];
}
返回r[a];
},数组)[索引]=值;
}
函数getValue(数组、路径){
返回路径.match(/\d+/g).reduce(函数(r,a){
返回r[a];
},数组);
}
设置值(代码,路径,42);
document.write(''+JSON.stringify(代码,0,4)+'');
write(getValue(代码,路径))好的,你的问题是什么?你能给出一些示例输出吗?我不知道你想要什么。。。您可以使用将某些内容附加到数组。为什么appendChind
?您正在使用DOM元素吗?如果是这样,请显示DOM树中的某些片段以及这些元素。我的输出将是附加到数组中正确节点上的元素。@RomanPerekhrestmyArray
是一个已经创建的HTML元素数组,我现在尝试循环并将它们附加到正确的位置。什么是myArray
,什么是myelement
,您试图实现什么?你的解释对我来说毫无意义<代码>000不是一个长度。我试过了,但仍然不起作用。。。我在上面发布了我的完整源代码。我很难理解你发布的代码。这个答案是针对您的原始问题,其中mystring
包含一系列数字数组索引,如“[0][1][23]”
。我在您的代码中没有看到任何创建字符串的内容,如[0][1][23]
。forEach
语句对数组而不是字符串进行操作。是的,我尝试了不同的格式,但在这里我将编辑它console.log(position)
在.replace()
Ahh之后,我在ele.position.replace(/0/g
中看到它。