我如何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(); }; };
它只是觉得…脏。 如果没有真正的优雅的方式去做,我会公开批评我的代码。 谢谢!
-
parsingJSON到JS。
var data = JSON.parse(theJson);
-
使用类似于:
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"); };
这应该是做到这一点,使用every
和has
:
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议:
-
我会给这个函数一个同步签名。 没有callback参数。 如果您遵守函数签名(例如,仅基于
config
和req_attr
答案),则不能有任何理由去asynchronous。 -
我会改变函数返回缺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