在 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 实例