I have a nested object and I would like to traverse it and update the property of 'error' to true if the 'value' property is an empty/falsy value. If the value of 'value' property is empty string, empty array, empty object, undefined or null, the corresponding 'error' property should be changed to true.
This is what I have:
const data = {
"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": []
}
}
}
function iter(o) {
Object.keys(o).forEach(function(k) {
if (o[k] !== null && typeof o[k] === 'object') {
iter(o[k]);
return;
}
if (o['value'] === undefined || !o['value'] || _.isEmpty(o.value)) {
o['error'] = true
}
});
}
iter(data)
console.log(data)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>
expected output:
{
"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": []
}
}
}
Please advice.
! check for undefined, 0, '', and null
for [] and {} use JSON.stringify() === '[]' to check if it empty
const data = {
"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": []
}
}
}
function iter(o) {
Object.keys(o).forEach(function(k) {
if (o[k] !== null && typeof o[k] === 'object') {
iter(o[k]);
return;
}
if (!o['value'] || JSON.stringify(o['value']) === '{}' || JSON.stringify(o['value']) === '[]') {
if (!o.hasOwnProperty('value')){
return;
}
o['error'] = true
return;
}
});
}
iter(data)
console.log(data)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加