Javascript 检查JSON对象的健全性 一次又一次,我必须处理代码,比如假设下面的例子: if (node.data.creatures.humans.women.number === Infinity) { // do-someting }
现在的问题是,若节点未定义,则该条件将中断。类似地,如果node.data未定义,node.data.biotes未定义等等,它将中断 因此,我最终使用了以下一种长期条件:Javascript 检查JSON对象的健全性 一次又一次,我必须处理代码,比如假设下面的例子: if (node.data.creatures.humans.women.number === Infinity) { // do-someting },javascript,json,object,sanity-check,Javascript,Json,Object,Sanity Check,现在的问题是,若节点未定义,则该条件将中断。类似地,如果node.data未定义,node.data.biotes未定义等等,它将中断 因此,我最终使用了以下一种长期条件: if (node && node.data && node.data.creatures && node.data.creatures.humans && node.data.creatures.women && node.data.creatu
if (node && node.data && node.data.creatures && node.data.creatures.humans && node.data.creatures.women && node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
现在,假设我也必须在代码的许多其他部分中使用JSON对象的一部分
代码突然变得非常难看。有没有更好的方法来避免像“cannotcallproperty of undefined”这样的错误,这是由于我提到的第一个条件导致的,这样代码看起来也更好
如何处理这种情况?尝试访问
未定义的上的属性是可捕获的类型错误
,因此您可以使用try..catch
:
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do something
}
} catch (e) {
// property doesn't exist
}
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
} catch () {
console.log(e);
}
您可以使用try
-catch
包装可能有害的零件:
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do something
}
} catch (e) {
// property doesn't exist
}
try {
if (node.data.creatures.humans.women.number === Infinity) {
// do-someting
}
} catch () {
console.log(e);
}
另一种可能更优雅的方法是定义预期的对象结构,并将其与实际数据合并,例如使用
这将确保结构如您所期望的那样,并且不存在的字段具有一些默认值
然后将其合并:
node = $.extend(nodeTemplate, node);
以下是我正在使用的方法,它可能不是“最优化器”的方法,但对我来说是有效的:
walkObject = function(obj, path) {
var i = 0,
part = void 0,
parts = path.split('.');
while (obj && (part = parts[i++])) {
obj = obj[part];
}
return obj;
};
该方法获取一个对象,以及包含要测试的属性的点符号的字符串:
// the object
var obj = { a: { b: {c: [1,2,3], d: "aa"} } };
// tests
console.log("a,b,c", walkObject(obj, 'a.b.c')); // [1,2,3]
console.log("a,b,e", walkObject(obj, 'a.b.e')); // undefined
console.log("z,b,e", walkObject(obj, 'z.b.e')); // undefined
新的代理API(非常新,支持有限)可以很容易地解决这个问题:注意,它是一个JavaScript对象,而不是JSON对象。数据的JSON表示,如果您以JSON格式解析该数据,您将得到一个JavaScript对象作为结果。