JavaScript динамически создает многомерный массив из строки - PullRequest
2 голосов
/ 20 мая 2011
<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>

и мне нужно сделать из них многомерный массив на примере идентификатора из элемента <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()

Ответы [ 2 ]

5 голосов
/ 20 мая 2011

Я не напишу все это для вас, я просто немного помогу с трудной частью.

Этот фрагмент извлекает из него две строки (в основном id и innerHTML, здесь s и s2) и создает вложенный объект (в 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. Если у вас есть дополнительные вопросы, я с радостью помогу.

0 голосов
/ 20 мая 2011

это почти сработало (не так элегантно, как рекурсивная функция)

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

Отсутствует 128 с пульта / id, но все остальное работает. Я хотел бы выяснить, что нужно сделать, чтобы получить 128 от узла, который короче, чем 4

Я согласен, что она не гибкая, как рекурсивная функция, но я хотел посмотреть, смогу ли я сначала создать "грубую силу", а затем сравнить ее с чем-то более умным.

<code><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"
  } 
}
var spans = document.getElementsByTagName ("span"); var myObject = {}; for (var i = 0; i '); var val = spans [i] .innerHTML if (parts [0]) {// Локальный или удаленный if (myObject [parts [0]] == null) myObject [parts [0]] = {}; if (parts [1]) {// ethernet или id if (myObject [parts [0]] [parts [1]] == null) myObject [parts [0]] [parts [1]] = (parts.length == 1)? val: {}; if (parts [2]) {// порт3 или порт1 if (myObject [parts [0]] [parts [1]] [parts [2]] == null) myObject [parts [0]] [parts [1]] [parts [2]] = (parts.length = ? = 2) вал: {}; if (parts [3]) {// rx_flow или rx MyObject [деталь [0]] [части [1]] [части [2]] [деталь [3]] = Val; } } } } } for (var o в myObject) {// локальный или удаленный document.write (о + '/'); for (var p в myObject [o]) {// ethernet или id document.write (р + '/'); for (var q в myObject [o] [p]) {// порты document.write (д + ': /'); for (var r в myObject [o] [p] [q]) {// rx_flow или rx document.write (r + '-' + myObject [o] [p] [q] [r] + '
'); } } } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...