我如何validation是否有几个属性在JavaScript中的JSON结构?

我正在创build一个模块,它需要几个复杂的JSON文件,并希望某些代码在给定的元素不存在的情况下给予用户反馈。

下面是我现在这样做的方式,但我不禁认为必须有一个更干净,更简单的方法。

var _und = require("underscore"); //this function takes a list of required attributes and ensures they are present var check_req_attr = function(config, req_attr, callback) { var config_attr = Object.keys(config); var absent_attr = _und.difference(req_attr, config_attr); //slightly hacky code that checks to ensure config has correct vars if (absent_attr.length !== 0) { throw Error("missing following attributes from config:" + absent_attr); } else { callback(); }; }; 

它只是觉得…脏。 如果没有真正的优雅的方式去做,我会公开批评我的代码。 谢谢!

  1. parsingJSON到JS。

    var data = JSON.parse(theJson);

  2. 使用类似于:

     function hasKey(obj, key) { return typeof obj[key] !== 'undefined'; }; function hasKeys(obj, keys) { for (var i = 1, len = keys.length; i < len; i++) { if (!hasKey(obj, keys[i])) { return false; }; }; return true; }; 

现在你可以简单地做:

 if (hasKeys(data, ["firstKey", "secondKey", "thirdKey"]) { console.log("valid"); }; 

这应该是做到这一点,使用everyhas

 if (_und.every(req_attr, function(attr) { return _und.has(config, attr); })) throw new Error(); 

在本地环境中,您只需使用in运算符 :

 req_attr.every(function(attr){ return attr in config; }) 

我认为你的解决scheme其实挺优雅的! 不需要匿名函数,并且循环(显然必须在某个点发生)整齐地被抽象出来。

两点build议:

  1. 我会给这个函数一个同步签名。 没有callback参数。 如果您遵守函数签名(例如,仅基于configreq_attr答案),则不能有任何理由去asynchronous。

  2. 我会改变函数返回缺less的属性(属性是错误的术语)。 你也可以添加一个requireProperties函数,该函数使用这个“检查”函数,如果一个属性丢失会抛出。 这允许不同types的用途。

你为什么不尝试这样的事情:

 obj = JSON.parse(json); 

然后检查

 if(obj.YourProperty == undefined){ //do something.. } 

希望我明白你的问题..它也应该与复杂的JSON文件..祝你好运;)

你也可以使用in运算符( requiredAttr in obj ):

 function objHasAllRequiredAttrs(obj, attrNames) { return attrNames.reduce(function(memo, attrName) { return memo && (attrName in obj); }, true); } objHasAllRequiredAttrs({foo:1}, ['foo']); // => true objHasAllRequiredAttrs({bar:1}, ['foo']); // => false