JavaScript 从字符串动态创建多维数组

javascript dynamically create multidimensional array from string

本文关键字:数组 创建 动态 字符串 JavaScript      更新时间:2023-09-26
<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>

我需要通过 ID 从它们制作多维数组元素 <span id="local->ethernet->port3->rx_flow">q4234</span> 中的示例

我需要的数组是array["local"]["ethernet"]["port3"]["rx_flow"]="q4234"

我创建的函数是:

    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;
    }

而且我不知道如何使函数make_obj()

我不会为你写整件事,我只是帮忙解决困难的部分。

这个片段将把两个字符串(基本上是idinnerHTML,这里ss2)从中构造一个嵌套对象(Javascript中没有关联数组)。

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;
}

它使用递归来实现其目标。如果您对代码有任何疑问,请询问。

在这里你可以尝试一下。

还有什么可做的?

猜你想把这些东西从跨度收集到一个对象中,我的例子将为每个s/s2创建一个对象。如果您有任何其他问题,我很乐意为您提供帮助。

这几乎有效(不如递归函数那么优雅)

http://jsfiddle.net/mplungjan/3zhwv/

从遥控器/id 中缺少 128,但其余的都可以工作。我想弄清楚该怎么做才能从短于 128 的节点中获取 4

同意它不像递归函数那样灵活,但我想看看我是否可以先制作一个"蛮力",然后将其简化为更聪明的东西。

<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>