2015-07-13 2 views
-2

Иерархия может быть очень глубокой. Итак, как проверить, существует ли свойство где-то внутри корневого объекта? Если нет, то создайте его.Как проверить, существует ли object.subobject.subsubobject в javascript?

У меня есть следующий HTML

<div id="container"> 
    <div id="level-1"> 
     <input id="value-1" group="a.b" name="c" value="some-value-1"> 
    </div> 
</div> 

Теперь я хотел бы поставить значение этого входа в javascript объекта на основе родительского атрибута.

Желаемая выход

{ 
    "a" : { 
     "b" : { 
     "c" : "some-value-1" 
     } 
    } 

} 

Мой усилию:

function traverse(id, obj) { 
    var methodName = "traverse"; 
    var elementToTraverse = document.getElementById(id); 
    var currentElementLength = elementToTraverse.childNodes.length; 

    if (currentElementLength > 0) { 

     var children = getChildNodes(elementToTraverse); 
     for (var ch in children) { 
      var currentChild = children[ch]; 
      //ignore the text nodes 
      if (currentChild.nodeType == 3) { 
       continue; 
      } 

      if (currentChild.nodeType == 1 && currentChild.childNodes.length > 0 && currentChild.id != "") { 
       //call without the object argument as it has already been constructed. 
       traverse(currentChild.id, obj); 
      } 
      else if (currentChild.nodeType == 1 && currentChild.id != "" && currentChild.getAttribute('name') != null) { 
       if (DEBUG) { 
        logOnConsole(methodName, currentChild.getAttribute('name') + "--" + currentChild.id, logLevel.INFO); 
       } 
       var group = currentChild.getAttribute('group') || null; 
       var name = currentChild.getAttribute('name'); 
       var value = getValue(currentChild); 

       if (value == "" || value == undefined) { 
        if(group){ 
         if(isNull(obj[group])){ 
          obj[group] = new Object(); 
         } 
         obj[group][name] = ""; 
        } 
        else{ 
         obj[name] = ""; 
        } 
       } 
       else if(group){ 
        if(isNull(obj[group])){ 
         obj[group] = new Object(); 
        } 
        obj[group][name] = value; 
       } 
       else { 
        obj[name] = value; 
       } 

      } 
      else { 

       if (DEBUG) { 
        logOnConsole(methodName, "Element not useful. \n" + currentChild.nodeName, logLevel.INFO); 
       } 
      } 
     } 
    } 
    return obj; 
} 

Я называю это с помощью траверсы ('контейнер-ид', новый объект()), но это будет работать единственное значение в группе, а не вложенную структуру.

+0

добавить пример и ваши усилия. – Mritunjay

+0

Я сделал, должен ли он все еще быть проголосован? – cafebabe1991

ответ

0

Попробуйте

function isExist(obj, path) { 
 
    patharray = path.split("."); 
 
    for(var i=0;i < patharray.length; i++) { 
 
     obj = obj[patharray[i]]; 
 
     if(obj === undefined) return false 
 
    } 
 
    return true; 
 
} 
 

 
document.body.innerHTML = isExist({subobject:{subsubobject:{test: 34}}}, 'subobject.subsubobject');

+0

Он не скажет, какой подобъект не существует. Тогда я не буду знать, какой из них нужно создать. Итак, чтобы завершить, я должен проверять полную иерархию один за другим из корня? Что сказать ? – cafebabe1991

+0

@ cafebabe1991 вместо возврата false вы можете вернуть patharray [i], который является подобъектом, не существует – Anoop

+0

Да, но вам придется вызывать эту функцию рекурсивно, чтобы создать каждый объект, который еще не создан. (И вы не создали объект в своем ответе) – cafebabe1991

Смежные вопросы