javascript从字符串动态创建多维数组
我不知道如何制作函数make_obj我不会为你写全部内容,我只是帮你做一些困难的部分 这个代码段将采用两个字符串,基本上是id和innerHTML,这里是s和s2,并构造一个嵌套对象,Javascript中没有关联数组javascript从字符串动态创建多维数组,javascript,arrays,object,Javascript,Arrays,Object,我不知道如何制作函数make_obj我不会为你写全部内容,我只是帮你做一些困难的部分 这个代码段将采用两个字符串,基本上是id和innerHTML,这里是s和s2,并构造一个嵌套对象,Javascript中没有关联数组 function make_cfg(){ var result=new Array(); var x=document.getElementById(*); var len=x.length; var arr; for (var i
function make_cfg(){
var result=new Array();
var x=document.getElementById(*);
var len=x.length;
var arr;
for (var i=0; i<=len; i++;){
if(x[i].id){
if(x[i].id.indexOf("->") != -1) {
arr=x[i].id.split("->");
result=make_obj(result,arr);
}
}
}
return result;
}
它使用递归来实现其目标。如果您对代码有任何疑问,请询问
还有什么事要做
我猜你想把这些东西从跨度收集到一个对象中,我的示例将为每个s/s2创建一个对象。如果您还有其他问题,我很乐意提供帮助。这几乎没有递归函数那么优雅 远程/id中缺少128个,但其余的可以工作。我想知道如何从短于4的节点获取128
我同意它不像递归函数那样灵活,但我想看看我能否先做一个蛮力,然后把它放在更聪明的东西上。
var s='local->ethernet->port3->rx_flow',
s2='q4234',
a=s.split('->'),
obj=constructObject(a, s2);
function constructObject(a, final) {
var val=a.shift();
var obj={};
if (a.length>0) {
obj[val]=constructObject(a, final);
} else {
obj[val]=final;
}
return obj;
}
我的答案遗漏了什么?ThanksI做了函数constructObjecta,final,obj{var val=a.shift;如果a.length>0{if!obj[val]{obj[val]={};}obj[val]=constructObjecta,final,obj[val];}否则{obj[val]=final;}返回obj;}@crab似乎很酷:。你可以替换!obj[val]与!obj.hasOwnPropertyval是非常安全的,并且有一个很好的代码。非常感谢@bazmegakapa有一个例子它是如何工作的:nice job@crab!如果你对我的答案感到满意,你可以接受答案左边的勾号。嗯,很难阅读,也不太灵活。如果需要添加另一个->零件,会发生什么情况?我还没有找到确切的问题所在,不容易分析。我猜myObject[parts[0]==null by myObject.hasOwnPropertyparts[0]和所有类似的问题。@Baz请查看更新。我知道它不灵活,但我必须先弄清楚结构。hasOwnProperty不是必需的。我的脚本可以工作,但小于4的节点除外。我想我只需要测试内容是字符串还是对象
var s='local->ethernet->port3->rx_flow',
s2='q4234',
a=s.split('->'),
obj=constructObject(a, s2);
function constructObject(a, final) {
var val=a.shift();
var obj={};
if (a.length>0) {
obj[val]=constructObject(a, final);
} else {
obj[val]=final;
}
return obj;
}
<span id="local->ethernet->port3->rx_flow">q4234</span>
<span id="local->ethernet->port3->rx">q345</span>
<span id="local->ethernet->port1->rx_flow">128</span>
<span id="remote->id">128</span>
<hr/>
<pre>
myObject = {
"local":{
"ethernet":{
"port3": {
"rx_flow":"q4234",
"rx":"q345"
}
"port1": {
"rx_flow":"128"
}
}
},
"remote":{
"id":"128"
}
}
</pre>
<script>
var spans = document.getElementsByTagName("span");
var myObject = {};
for (var i=0;i < spans.length;i++) {
var id = spans[i].id;
var parts = id.split('->');
var val = spans[i].innerHTML
if (parts[0]) { // Local or remote
if (myObject[parts[0]] == null) myObject[parts[0]]={};
if (parts[1]) { // ethernet or id
if (myObject[parts[0]][parts[1]] == null) myObject[parts[0]][parts[1]]=(parts.length==1)?val:{};
if (parts[2]) { // port3 or port1
if (myObject[parts[0]][parts[1]][parts[2]] == null) myObject[parts[0]][parts[1]][parts[2]]=(parts.length==2)?val:{};
if (parts[3]) { // rx_flow or rx
myObject[parts[0]][parts[1]][parts[2]][parts[3]]=val;
}
}
}
}
}
for (var o in myObject) { // local or remote
document.write(o+'/');
for (var p in myObject[o]) { // ethernet or id
document.write(p+'/');
for (var q in myObject[o][p]) { // ports
document.write(q+':/');
for (var r in myObject[o][p][q]) { // rx_flow or rx
document.write(r+' - '+myObject[o][p][q][r]+'<br/>');
}
}
}
}
</script>