如何检查object.subobject.subsubobject是否存在或不在JavaScript中?

如何检查object.subobject.subsubobject是否存在或不在JavaScript中?

问题描述:

层次结构可能非常深,那么如何检查某个属性是否存在于根对象内的某处?如果没有,然后创建它。如何检查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; 
} 

我把它通过移动( '集装箱ID',新的对象()),但是这会为工作组中的单个值而不是嵌套结构。

+0

添加一个例子,你的努力。 – Mritunjay

+0

我做过了,是不是应该投下来呢? – cafebabe1991

试试这个

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