【问题标题】:Detect if an Object has children in JavaScript在 JavaScript 中检测对象是否有子对象
【发布时间】:2011-08-18 18:02:10
【问题描述】:

在 JavaScript 中,您可以像这样获取 XML 节点的子节点...

var children = xml.childeNodes;

如何获取对象的子对象?

var obj = {
  prop1: 'stuff',
  prop2: 'things',
  prop3: 'stuff-n-things'
}

第二轮

给定一个像这样的对象..

var Obj = {
  levelOneProp1: 'stuff',
  levelOneProp2: 'things',
  levelOneProp3: {
     levelTwoProp1: 'moreStuff',
     levelTwoProp2: 'morethings',
     levelTwoProp3: 'morestuff-n-things'
  } 
}

我想知道Obj 中的哪些属性有子级,以便我可以递归方式遍历它们。目标是能够提供具有(理论上)无限数量的子元素的数据集,并将它们的值应用于输入元素......这是我到目前为止所拥有的。

function applyData( dataSet ){
    var hasChildren = false;

    for(var i = 0; i < dataSet.childNodeArrayGoesHere.length; i++){
        if(dataSet.detectChildNodesHere){
            hasChildren = true;
        }
    }

    if(hasChildren){
        for(var j = 0; j < dataSet.childNodeArrayGoesHere.length; i++){
            applyData(dataSet[j]);
        }
    } else {
        //apply the key/value pair to an input element

        $("input[name" + dataSet.propertyName + "]").val(dataSet.propertyValue);
    }
}

【问题讨论】:

  • 请避免大幅改变问题的上下文。当你这样做时,你会使一些现有的答案变得无用。请尝试创建另一个问题。
  • @ates - 我有点明白你在做什么,但问题只是澄清了 IMO。我仍然只需要“子节点”的集合来完成我的功能。
  • 我只需要检测一个属性是否本质上是一个“结束节点”......抱歉模棱两可。

标签: javascript json parsing


【解决方案1】:

你可以遍历对象like this的所有属性:

var o = { prop1: 'this is prop 1', prop2: 'this is prop2'};

for(var propName in o) {
    if(o.hasOwnProperty(propName)) {
        alert(o[propName]);   
    }
}

hasOwnProperty() 函数检查以确保指定的属性确实存在于对象中。在此上下文中使用它可确保您不会获得任何继承的属性。

【讨论】:

  • for(var i in o) 循环确实可以遍历整个对象,但是如果您阅读我的编辑,就会发现我...本质上...试图检测某物是否是@987654325 @ 或不以将其应用于输入字段
  • 这不会读取存在的子元素。我还没有答案要添加任何其他建议。
【解决方案2】:

您可以递归地遍历对象的所有属性like this

找到所有的结束节点,按名称选择对应的输入标签并将值放入其中。

我使用了一个只有两个级别的对象,但它可以与一个 n 级别的对象一起使用。

var Obj = {
          id1: 'stuff',
          id2: 'things',
          id3: {
              levelTwo1: 'moreStuff',
              levelTwo2: 'morethings',
              levelTwo3: 'morestuff-n-things'
          }
      }

function addAttributeInput(obj) {
    for (var o in obj) {
        if (typeof obj[o] == "object") {
            addAttributeInput(obj[o]);
        } else {
            $("input[name='" + o + "']").val(obj[o]);
        }
    }
}

addAttributeInput(Obj);

【讨论】:

    【解决方案3】:

    那些不是孩子,你已经创建了一个关联数组。

    像这样访问它们:

    obj[prop1]
    

    【讨论】:

    • 从技术上讲,Javascript 根本没有关联数组。只是常规的数组和对象。
    • 没错,在这种情况下,它是一个用作关联数组的对象。
    【解决方案4】:

    您正在寻找的实际上是对象键。您可以通过调用它来检查对象键是否存在:

    你的对象:

    var obj = {
        prop1: 1,
        prop2: 2
    }
    

    检查是否未定义:

    if (obj.prop3 === undefined) {
        alert('obj key does not exist');
    } else {
        alert(obj.prop3);
    }
    

    if (obj["prop3"] === undefined) {
        alert('obj key does not exist');
    } else {
        alert(obj["prop3"]);
    }
    

    或者,如果您遇到可能手动将 obj 键的值设置为 undefined 的用例:

    if (obj.hasOwnProperty("prop3")) {
        alert(obj["prop3"])
    } else {
        alert('obj key does not exist');
    }
    

    【讨论】:

    • obj.key3 === undefined 不是检查属性是否存在的好方法:stackoverflow.com/questions/1098040/…
    • 我认为手动将 obj 键的值设置为 undefined 与最佳实践相去甚远
    • 至少有 16 人不同意您的观点(请参阅我的回答的 cmets)。有非常真实的用例可以将属性设置为undefined。该属性也可以设置为null,在这种情况下,与undefined 比较将产生匹配。
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2018-02-19
    • 2011-10-20
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多