Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查JSON对象的健全性 一次又一次,我必须处理代码,比如假设下面的例子: if (node.data.creatures.humans.women.number === Infinity) { // do-someting }_Javascript_Json_Object_Sanity Check - Fatal编程技术网

Javascript 检查JSON对象的健全性 一次又一次,我必须处理代码,比如假设下面的例子: if (node.data.creatures.humans.women.number === Infinity) { // do-someting }

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

现在的问题是,若节点未定义,则该条件将中断。类似地,如果node.data未定义,node.data.biotes未定义等等,它将中断

因此,我最终使用了以下一种长期条件:

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对象作为结果。