1

いくつかの複雑な 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();
    };
};

それはただ...汚れているように感じます。それを行うための本当にエレガントな方法がない場合、私は自分のコードに対する批評を受け入れるでしょう. ありがとう!

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

everyこれは、 andを使用して行う方法である必要があります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 に答える
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 に答える
0

次のようなものを試してみませんか。

obj = JSON.parse(json);

そしてチェック

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

私はあなたの質問を理解したことを願っています..複雑なJSONファイルでも動作するはずです..頑張ってください;)

于 2013-05-06T13:27:43.137 に答える