Javascript 基于另一个属性-JS的值更新嵌套对象属性

Javascript 基于另一个属性-JS的值更新嵌套对象属性,javascript,object,lodash,Javascript,Object,Lodash,我有一个嵌套对象,如果'value'属性为空/falsy值,我希望遍历它并将'error'属性更新为true。如果“value”属性的值为空字符串、空数组、空对象、未定义或null,则相应的“error”属性应更改为true 这就是我所拥有的: const数据={ “项目1”:{ “价值”:88, “错误”:错误 }, “项目2”:{ “价值”:655, “错误”:错误 }, “第3项”:错误, “项目4”:[], “第5项”:“, “第6项”:“, “第7项”:错误, “项目8”:{ “值”

我有一个嵌套对象,如果'value'属性为空/falsy值,我希望遍历它并将'error'属性更新为true。如果“value”属性的值为空字符串、空数组、空对象、未定义或null,则相应的“error”属性应更改为true

这就是我所拥有的:

const数据={
“项目1”:{
“价值”:88,
“错误”:错误
},
“项目2”:{
“价值”:655,
“错误”:错误
},
“第3项”:错误,
“项目4”:[],
“第5项”:“,
“第6项”:“,
“第7项”:错误,
“项目8”:{
“值”:未定义,
“错误”:错误
},
“项目9”:{
“价值”:[],
“错误”:错误
},
“项目10”:{
“价值”:[],
“错误”:错误
},
“项目11”:{
“价值”:[],
“错误”:错误
},
“第12项”:错误,
“项目13”:{
“第1项”:{
“名称”:“国家”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
},
“分项2”:{
“名称”:“组”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
},
“分项3”:{
“名称”:“产品”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
}
}
}
功能iter(o){
Object.keys(o).forEach(函数(k){
if(o[k]!==null&&typeof o[k]==='object'){
iter(o[k]);
返回;
}
如果(o['value']==未定义的| |!o['value']| | | | i.isEmpty(o.value)){
o['error']=true
}
});
}
国际热核实验堆(数据)
console.log(数据)
!检查是否存在未定义、0“”和null

对于[]和{},使用JSON.stringify()=='[]检查它是否为空

const数据={
“项目1”:{
“价值”:88,
“错误”:错误
},
“项目2”:{
“价值”:655,
“错误”:错误
},
“第3项”:错误,
“项目4”:[],
“第5项”:“,
“第6项”:“,
“第7项”:错误,
“项目8”:{
“值”:未定义,
“错误”:错误
},
“项目9”:{
“价值”:[],
“错误”:错误
},
“项目10”:{
“价值”:[],
“错误”:错误
},
“项目11”:{
“价值”:[],
“错误”:错误
},
“第12项”:错误,
“项目13”:{
“第1项”:{
“名称”:“国家”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
},
“分项2”:{
“名称”:“组”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
},
“分项3”:{
“名称”:“产品”,
“集团”:{
“值”:{},
“错误”:错误
},
“实例”:[]
}
}
}
功能iter(o){
Object.keys(o).forEach(函数(k){
if(o[k]!==null&&typeof o[k]==='object'){
iter(o[k]);
返回;
}
如果(!o['value']| JSON.stringify(o['value'])==='{}'| JSON.stringify(o['value'])===='[]{
如果(!o.hasOwnProperty('value')){
返回;
}
o['error']=true
返回;
}
});
}
国际热核实验堆(数据)
console.log(数据)

这里是一个使用的迭代解决方案。这可能更容易推理

//const objectScan=require('object-scan');
const myData={item1:{value:88,error:false},item2:{value:655,error:false},item3:false,item4:[],item5:'',item6:'',item7:false,item8:{value:undefined,error:false},item9:{value:[],error:false},item10:{value:[],error:false},item11:{value:[],error:false},item12:false,item13:{subItem1{name:'Country',group:{value:{},error:false},instances:[]},subItem2:{name:'group',group:{value:{},error:false},instances:[]},subItem3:{name:'Product',group:{value:{},error:false},instances:[]};
常量修改=(数据)=>objectScan(['**.value']{
rtn:'计数',
filterFn:({parent,value})=>{
如果(!value | |)(对象和对象的值实例.keys(value).length==0)){
parent.error=true;
返回true;
}
返回false;
}
})(数据);
console.log(modify(myData));//找到多少个“error”值
// => 7
console.log(myData);
//=>{item1:{value:88,error:false},item2:{value:655,error:false},item3:false,item4:[],item5:'',item6:'',item7:false,item8:{value:undefined,error:true},item9:{value:[],error:true},item10:{value:[],error:true},item11:{value:[],error:true},item12:false,item13:{subItem1{name:'Country',group:{value:{},error:true},instances:[]},subItem2:{name:'group',group:{value:{},error:true},instances:[]},subItem3:{name:'Product',group:{value:{},error:true},instances:[]}
。作为控制台包装{最大高度:100%!重要;顶部:0}

为什么子项1有一个新字段“error”?等一下,让我检查一下。我检查了,这是因为子项“value”未定义,让我更新codeDone编辑,我添加了属性检查,所以如果没有“value”属性,我们就不会添加error true值