JavaScript中检测对象是否有子元素

8
在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);
    }
}

6
请避免大幅度改变问题的背景。这样做会使一些现有的答案失去意义。请尝试创建另一个问题。 - Ates Goral
@ates - 我有点明白你的意思,但我认为问题已经得到了澄清。我仍然只需要收集“子节点”以完成我的函数。 - Derek Adair
我只需要检测一个属性是否是“终节点”,抱歉表述不够清晰。 - Derek Adair
5个回答

7

您可以递归地遍历对象的所有属性,像这样

找到所有末端节点,通过名称选择相应的输入标签,并将值放入其中。

我使用的是只有两个级别的对象,但它也可以用于 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);

7
您可以像这样迭代对象的所有属性:
var o = { prop1: 'this is prop 1', prop2: 'this is prop2'};

for(var propName in o) {
    if(o.hasOwnProperty(propName)) {
        alert(o[propName]);   
    }
}
< p > hasOwnProperty() 函数用于检查指定的属性是否实际存在于对象中。在此上下文中使用它可以确保您不会得到任何继承的属性。


for(var i in o) 循环可以迭代整个对象,但如果您阅读我的编辑,则会发现我实际上试图检测某些内容是否为“结束节点”,以便将其应用于输入字段。 - Derek Adair
如果存在子元素,这不会读取它们。我还没有答案来添加其他建议。 - KeyOfJ

3

这段代码检测 obj 是否有任何子元素

Object.keys(obj).length

这似乎是唯一回答了特定问题的答案。 - Danny Acosta
这是本页面上所有答案中唯一相关的答案。谢谢。 - Srijan

0

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

像这样访问它们:

obj[prop1]

从技术上讲,Javascript根本没有关联数组。只有普通的数组和对象。 - Mark Biek
在这种情况下,True是被用作关联数组的对象。 - Porco

-3
你要查找的实际上是对象键。你可以通过调用它来检查对象键是否存在: 你的对象:
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"]);
}

或者,如果您遇到一个使用情况,其中对象键的值可能会手动设置为未定义:

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

1
obj.key3 === undefined 不是检查属性存在的好方法:https://dev59.com/ZnNA5IYBdhLWcg3wF5qO#1098955 - Ates Goral
我认为手动将对象键的值设置为未定义远非最佳实践。 - ezmilhouse
2
至少有16个人不同意你的观点(请查看我的回答下面的评论)。存在非常真实的用例,其中属性可以设置为“undefined”。该属性也可以设置为“null”,在这种情况下,与“undefined”的比较将产生匹配。 - Ates Goral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接