Javascript JSON未定义属性-简化验证以避免类型错误
我试图有效地验证多层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
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])
控制台。日志(随机场景。颜色。蓝色);
希望我们很快就能找到