Mar*_*cus 7 javascript undefined
我试图找到一种优雅的方法来检查对象中是否存在某些深度属性.因此,实际上试图避免对未定义的怪异保护性检查.
if ((typeof error !== 'undefined') &&
(typeof error.responseJSON !== 'undefined') &&
(typeof error.responseJSON.error) &&
(typeof error.responseJSON.error.message)) {
errorMessage = error.responseJSON.error.message;
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑的是一个方便功能
if (exists(error.responseJSON.error.message)) { ... }
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?为方便起见,使用下划线 - 库是可以的解决方案.
Tib*_*bos 20
有几种可能性:
试着抓
try {
errorMessage = error.responseJSON.error.message;
} catch(e) { /* ignore the error */}
Run Code Online (Sandbox Code Playgroud)
失败:
Object.defineProperty(error, 'responseJSON', {
get: function() { throw new Error('This will not be shown')
});
Run Code Online (Sandbox Code Playgroud)
&&
errorMessage = error && error.responseJSON && error.responseJSON.error && error.responseJSON.error.message;
Run Code Online (Sandbox Code Playgroud)
失败:
error.responseJSON = 0;
// errorMessage === 0 instead of undefined
Run Code Online (Sandbox Code Playgroud)
功能
function getDeepProperty(obj,propstr) {
var prop = propstr.split('.');
for (var i=0; i<prop.length; i++) {
if (typeof obj === 'object')
obj = obj[prop[i]];
}
return obj;
}
errorMessage = getDeepProperty(error, 'responseJSON.error.message');
// you could put it all in a string, if the object is defined in the window scope
Run Code Online (Sandbox Code Playgroud)
失败:
// It's hard(er) to use
Run Code Online (Sandbox Code Playgroud)
功能替代 - 请参阅@Olical的评论
function getDeepProperty(obj) {
for (var i=1; i<arguments.length; i++) {
if (typeof obj === 'object')
obj = obj[arguments[i]];
}
return obj;
}
errorMessage = getDeepProperty(error, 'responseJSON', 'error', 'message');
Run Code Online (Sandbox Code Playgroud)
尝试使用下划线mixin查找带路径的变量.它需要一个对象和字符串和t
_.mixin({
lookup: function (obj, key) {
var type = typeof key;
if (type == 'string' || type == "number")
key = ("" + key).replace(/\[(.*?)\]/, function (m, key) { //handle case where [1] may occur
return '.' + key.replace(/["']/g, ""); //strip quotes
}).split('.');
for (var i = 0, l = key.length; i < l; i++) {
if (_.has(obj, key[i]))
obj = obj[key[i]];
else
return undefined;
}
return obj;
}
});
Run Code Online (Sandbox Code Playgroud)
现在打电话给你的例子:
_.lookup(error, 'responseJSON.error.message') // returns responseJSON.error.message if it exists otherwise `undefined`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4404 次 |
| 最近记录: |