在 JavaScript 中检测对象是不是有子对象

Posted

技术标签:

【中文标题】在 JavaScript 中检测对象是不是有子对象【英文标题】: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。我仍然只需要“子节点”的集合来完成我的功能。 我只需要检测一个属性是否本质上是一个“结束节点”......抱歉模棱两可。 【参考方案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 不是检查属性是否存在的好方法:***.com/questions/1098040/… 我认为手动将 obj 键的值设置为 undefined 与最佳实践相去甚远 至少有 16 人不同意您的观点(请参阅我的回答的 cmets)。有非常真实的用例可以将属性设置为undefined。该属性也可以设置为null,在这种情况下,与undefined 比较将产生匹配。

以上是关于在 JavaScript 中检测对象是不是有子对象的主要内容,如果未能解决你的问题,请参考以下文章

检测 JavaScript 对象是不是是 FormData 实例

检测 JavaScript 对象是不是有一些引用 DOM 元素的属性

JavaScript&jQuery.3组内置对象

JavaScript中判断是否对象的方法是啥?

JS中判断对象是不是数组的方法

什么才是正确的javascript数组检测方式