Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON未定义属性-简化验证以避免类型错误_Javascript_Json_Properties_Undefined_Simplify - Fatal编程技术网

Javascript JSON未定义属性-简化验证以避免类型错误

Javascript JSON未定义属性-简化验证以避免类型错误,javascript,json,properties,undefined,simplify,Javascript,Json,Properties,Undefined,Simplify,我试图有效地验证多层json对象,根据场景,这些对象可能有一个或多个未定义的父属性 这是一个对象示例,仅包含两个级别的属性: scenarioArray = [ {color:{blue:'yes'}}, {color:{green:'no'}}, {colour:{blue:'yes'}} ]; //colour instead of color 所以我想最有效地识别场景的颜色 let color; let s = randomScenario; //random scenario fr

我试图有效地验证多层json对象,根据场景,这些对象可能有一个或多个未定义的父属性

这是一个对象示例,仅包含两个级别的属性:

scenarioArray = [ 
{color:{blue:'yes'}},
{color:{green:'no'}},
{colour:{blue:'yes'}} ]; //colour instead of color

所以我想最有效地识别场景的颜色

let color;
let s = randomScenario; //random scenario from the scenarioArray
if(s.color != undefined && s.color.blue != undefined) {
    color = s.color.blue;
} else if (s.color != undefined && s.color.green != undefined) {
    color = s.color.green;
} else if (s.colour != undefined && s.colour.blue !=undefined) {
    color = s.colour.blue;
};
这段代码在技术上是有效的,只是很混乱

当您将其外推到具有4-5个属性级别的对象中时,if语句将变得难以理解

我很想知道如何简化这项工作

真实json对象示例:

addendum.contract.buyerInformation.name 
addendum.contract.contract.buyerInformation.name
addendum.contract.purchaser.buyerFirstName
addendum.contract.data.purchaser.buyer.name
使用的框架/库: 安格拉斯 洛达斯 (开放给任何可以提高效率的图书馆)


另外,如果这个问题对于stackOverflow来说过于开放,请告诉我。

这里有一个函数可以为您查找错误。它最多支持三个级别。它是可配置的。对于第4级和第5级,您可以对其进行扩展或使其递归,以实现无限级支持:

const validSecondLevels=[“蓝色”、“红色”、“绿色”]
const validHirdlevels=[“是”、“否”]
const validPropertyNames=['color']
场景数组=[
{color:{blue:'yes'}},
{color:{green:'无效值'}},
{颜色:{蓝色:'是'}}];
函数查找错误(场景){
var invalidProperties=scenarioArray.filter(函数(it)){
var invalidPropertyNames=Object.keys(it).filter(item=>!validPropertyNames.includes(item));
if(无效属性名称长度)
归还它;
var foundProperties=validPropertyNames.filter(item=>it[item]).map(item=>it[item]);
var invalids=foundProperties.filter(函数(属性)){
var invalidSecondLevels=Object.keys(property).filter(item=>!validSecondLevels.includes(item));
if(invalidSecondLevels.length)
归还财产;
var foundValues=validSecondLevels.filter(item=>property[item]).map(item=>property[item]);
var invalidThirdLevel=foundValues.filter(函数(foundValue){
return!validHirdlevels.includes(foundValue);
});
if(无效第三级长度)
归还财产;
});
if(无效长度)
归还它;
});
归还无效财产;
}

log(findErrors(scenarioArray))不幸的是,JavaScript缺少本机代码,但在某种程度上可以通过进行模拟

这是一个笨拙而脆弱的解决方案,但它将任何深度检查简化为两个操作,并且在大多数情况下都应该有效:

“严格使用”;
常量isEmpty=符号('isEmpty');
函数autoVivify(对象={}){
Object.defineProperty(Object,isEmpty{
get:()=>Object.keys(Object.length==0,
});
Object.keys(对象).forEach((键)=>{
const val=对象[键];
如果(typeof val=='object'&&val!==null)对象[键]=自动激活(val);
});
返回新代理(
对象
{get:(obj,name)=>obj中的name?obj[name]:obj[name]=autoVivify()},
);
}
const scenario数组=[
{color:{blue:'yes'}},
{color:{green:'no'}},
{颜色:{蓝色:'是'},
];
const randomScenario=Autovify(场景数组[0]);
if(randomScenario.color.blue&&!randomScenario.color.blue[isEmpty])
log(随机场景.颜色.蓝色);
if(randomScenario.color.red&&!randomScenario.color.red[isEmpty])
console.log(randomsecenario.color.red);
if(randomScenario.color.a.b.c&!randomScenario.color.a.b.c[isEmpty])
console.log(随机场景.color.a.b.c);
if(randomScenario.color.green&!randomScenario.color.green[isEmpty])
控制台。日志(随机场景。颜色。蓝色);
希望我们很快就能找到