1

我正在创建一个模块,该模块接收几个复杂的 JSON 文件,如果某些元素不存在,我希望有一些代码给用户反馈。

以下是我现在正在做的方式,但我不禁想到必须有一种更清洁,更少hacky的方式。

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();
    };
};

只是感觉……脏。如果没有真正优雅的方式来做到这一点,我愿意接受对我的代码的批评。谢谢!

4

5 回答 5

1
  1. 将 JSON 解析为 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");
};
于 2013-05-06T13:22:26.057 回答
1

这应该是这样做的方法,使用everyand 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; })
于 2013-05-06T13:35:12.997 回答
1

我认为您的解决方案实际上非常优雅!不需要匿名函数,并且循环(显然必须在某个时候发生)用difference.

两个建议:

  1. 我会给函数一个同步签名。没有回调参数。config如果您尊重函数签名(即仅基于您的答案) ,就没有任何理由去异步req_attr

  2. 我会更改函数以返回缺少的属性(属性是错误的术语)。您还可以添加一个requireProperties使用此“检查”函数的函数,如果缺少属性,该函数将抛出。这允许不同类型的用途。

于 2013-05-06T14:54:39.077 回答
0

你为什么不尝试类似的东西:

obj = JSON.parse(json);

然后检查

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

希望我理解你的问题..它也应该适用于复杂的 JSON 文件..祝你好运 ;)

于 2013-05-06T13:27:43.137 回答
0

您还可以使用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
于 2013-05-06T14:59:55.023 回答