我尝试使用node.js验证JSON对象。基本上,如果存在条件A,那么我想确保特定值在可能不存在的数组中。我在python中使用dictionary.get执行此操作,因为如果我查找不存在的内容,它将返回默认值。这就是它在python中的样子
if output.get('conditionA') and not 'conditionB' in output.get('deeply', {}).get('nested', {}).get('array', []):
print "There is an error somewhere you need to be fixing."
我想为javascript找到类似的技巧。我尝试使用下划线中的默认值来创建密钥,如果它们不在那里但我不认为我做得对,或者我没有按照预期的方式使用它。
var temp = _.defaults(output, {'deeply': {'nested': {'array': []}}});
if (temp.hasOwnProperty('conditionA') && temp.deeply.nested.array.indexOf('conditionB') == -1) {
console.log("There is an error somewhere you need to be fixing.");
}
看起来如果它遇到一个输出,其中一个嵌套对象丢失,它不会用默认值替换它,而是用TypeError: Cannot read property 'variety' of undefined
来点击其中'品种&#39 ;是我正在看的数组的名称。
答案 0 :(得分:4)
或者更好的是,这是一个模仿python词典功能的快速包装器。
http://jsfiddle.net/xg6xb87m/4/
function pydict (item) {
if(!(this instanceof pydict)) {
return new pydict(item);
}
var self = this;
self._item = item;
self.get = function(name, def) {
var val = self._item[name];
return new pydict(val === undefined || val === null ? def : val);
};
self.value = function() {
return self._item;
};
return self;
};
// now use it by wrapping your js object
var output = {deeply: { nested: { array: [] } } };
var array = pydict(output).get('deeply', {}).get('nested', {}).get('array', []).value();
修改强>
此外,这是一种快速而又脏的方法来执行嵌套/多条件:
var output = {deeply: {nested: {array: ['conditionB']}}};
var val = output["deeply"]
if(val && (val = val["nested"]) && (val = val["array"]) && (val.indexOf("conditionB") >= 0)) {
...
}
编辑2 根据Bergi的观察结果更新了代码。
答案 1 :(得分:2)
JS中的标准技术是(因为您的预期对象都是真实的)使用||
运算符作为默认值:
if (output.conditionA && (((output.deeply || {}).nested || {}).array || []).indexOf('conditionB') == -1) {
console.log("There is an error somewhere you need to be fixing.")
}
使用_.defaults
的问题在于它不是递归的 - 它不适用于深层嵌套的对象。
答案 2 :(得分:0)
您可以通过访问来检查javascript中是否存在密钥。
if (output["conditionA"]) {
if(output["deeply"]) {
if(output["deeply"]["nested"]) {
if(output["deeply"]["nested"]["array"]) {
if(output["deeply"]["nested"]["array"].indexOf("conditionB") !== -1) {
return;
}
}
}
}
}
console.error("There is an error somewhere you need to be fixing.");
return;
答案 3 :(得分:0)
如果你想要一些更易于使用和理解的东西,请尝试这样的事情。品尝季节。
function getStructValue( object, propertyExpression, defaultValue ) {
var temp = object;
var propertyList = propertyExpression.split(".");
var isMatch = false;
for( var i=0; i<propertyList.length; ++i ) {
var value = temp[ propertyList[i] ];
if( value ) {
temp = value;
isMatch = true;
}
else {
isMatch = false;
}
}
if( isMatch ) {
return temp;
}
else {
return defaultValue;
}
}
这里有一些测试:
var testData = {
apples : {
red: 3,
green: 9,
blue: {
error: "there are no blue apples"
}
}
};
console.log( getStructValue( testData, "apples.red", "No results" ) );
console.log( getStructValue( testData, "apples.blue.error", "No results" ) );
console.log( getStructValue( testData, "apples.blue.error.fail", "No results" ) );
console.log( getStructValue( testData, "apples.blue.moon", "No results" ) );
console.log( getStructValue( testData, "orange.you.glad", "No results" ) );
测试的输出:
$ node getStructValue.js
3
there are no blue apples
No results
No results
No results
$