首先,您不需要同时检查 property in object
&& typeof obj[property] == 'object'
,您只能使用typeof
来处理这两项检查。原因是,如果obj.property
不存在,typeof
将返回undefined
.
因此,您可以通过编写一个检查某物是否为对象的小型实用函数来模块化您的方法:
function isObject(o) {
return typeof o == 'object' && o !== null; // take care of the corner case that typeof null == 'object'
}
然后只需在必要的对象链上使用它,通过检查其所有拥有的对象是否存在来查找属性:
function getChecklistUrl() {
if(isObject(dataLayerObject) &&
isObject(dataLayerObject.config) &&
isObject(dataLayerObject.config.checklist)) {
return dataLayerObject.config.checklist;
}
return null;
}
var dataLayerObject = {
config: {
checklist: ['array of stuff']
}
}
function isObject(o) {
return typeof o == 'object' && o !== null;
}
function getChecklistUrl() {
if (isObject(dataLayerObject) &&
isObject(dataLayerObject.config) &&
isObject(dataLayerObject.config.checklist)) {
return dataLayerObject.config.checklist;
}
return null;
}
console.log(getChecklistUrl()[0]);
恕我直言,这使代码更有条理且更易于阅读。
您还可以为您的对象执行类似 getter 的操作,该对象采用点分隔的字符串并返回属性,如果属性不存在,则返回 null:
function getObjProperty(obj, propString) {
if(!isObject(obj) || !propString || typeof propString != 'string') {
return null; // make sure obj is an object and propString is a non-empty string
}
var props = propString.split('.');
for (var i = 0, l = props.length; i < l; i++) {
var p = props[i];
if(!isObject(obj[p])) { return null; } // if current property isn't an object, return null
obj = obj[p]; // otherwise update the object to the next one down the property chain
}
return obj;
}
你会像这样使用它:getObjProperty(dataLayerObject, 'config.checklist');
var dataLayerObject = {
config: {
checklist: ['array of stuff']
}
};
function isObject(o) {
return typeof o == 'object' && o !== null;
}
function getObjProperty(obj, propString) {
if (!isObject(obj) || !propString || typeof propString != 'string') {
return null;
}
var props = propString.split('.');
for (var i = 0, l = props.length; i < l; i++) {
var p = props[i];
if (!isObject(obj[p])) { //
return null;
} // if current property isn't an object, return null
obj = obj[p]; // otherwise update the object to the next one down the property chain
}
return obj;
}
console.log(getObjProperty(dataLayerObject, 'config.checklist'));
或者您可以使用相当简单的递归方法来实现这一点
注意:
上面的例子也检查了原型链。如果您不希望这样做,则应hasOwnProperty
在检查属性是否为对象时使用,同时检查该属性是否存在于测试对象上。
Prefix 的回答显示了这种方法的一种变体。