当你’重新使用您经常需要知道的对象是否已存在于对象中已存在的属性,以便在此操作中有2个解决方案已经很好地工作。但是当您在多个级别寻找未定义的属性时,它迅速变得一团糟。

一个例子

if(typeof object.props1.props2 == "undefined"){
// do stuff
}

如果Props1未定义,遗憾的是,您的浏览器将抛出该对象.Props1是未定义的。

倒带一点

首先,让我们’如果您唯一的工作在一个级别,请查看您的选择’s假设您想知道对象是否存在prop1

第一个解决方案:

if(object.hasOwnProperty("props1") ){
 // Do stuff
}

它非常自探索,如果它在物体中’得到了物业props1,但它不会看原型。这可能是一件好事或坏事,具体取决于你正在寻找的东西。

第二种解决方案:

if(props1 in object){
// do stuff
}

这也是一个很好的解决方案,我想你猜到了差异, 如果/ in. 将俯视属性的原型。

一个小警告,使用if / in数组’S不是一个好主意,在这种情况下,它将看原型并找到,例如,ToString。如果您增强了阵列原型,它也会迭代这些原型。

对象深度未知的水平呢。

不幸的是,没有什么生门的。在PHP中,您可以在任何内容上进行ISSET(),它会起作用,我们不是那么幸运。

尽管如此,还有办法做到这一点,这个想法是在对象级别迭代,直到我们删除undefined。

		// we pass the object and the props as an array ["props1", "props2"]
		function isset(object, props){
			// we will use the dump variable to iterate in the object
			var dump,
				propsLength = props.length -1;
			// loop in the properties 
			for(x=0;x<props.length;x++){
				// first prop?
				if(x == 0) {
					// add the object to dump (object.props1)
					dump = object[props[x]];
					continue;
				}
 
				// Undefined? return false
				if(typeof dump == "undefined" || typeof dump[props[x]] == "undefined"){
					return false;
				}else{
					// move in the object level 
					// object.props1.props2
					// object.props1.props2.props3
					dump = dump[props[x]];
					// return true, of even return the object back
					if(x == propsLength) return true;
				}
			}	
		}

你会用它来用它:

if( isset(object, ["props1", "props2", "props3"]) ){
// do stuff
}

演示

(需要console.log)查看演示

那’s it

I’我肯定可能有点优化,但你知道,它的工作很好,希望它也可以帮助你们!

5 thoughts on “在JavaScript中对象中的多级管理未定义的属性

评论被关闭。