J'ai un objet JSON comme suit
_submitInfo(allUsers) { var empty_fields = Object.entries(allUsers).map(([key, value]) => { return this._validateStudent(value) }) alert(JSON.stringify(empty_fields)) } _validateStudent(studentInfo) { empty = 0; Object.entries(studentInfo).map(([key, value]) => { if (value == "") { empty++ } }) return empty }
Dans le JSON ci-dessus, j'ai besoin de déterminer le nombre de champs vides dans chaque élève.
J'utilise le code suivant
var allUsers = { "student_a":{ id:1, full_name:"ABC", address:"xyz", image:"image url" }, "student_b":{ id:2, full_name:"DEF", address:"", image:"image url" }, "student_c":{ id:3, full_name:"", address:"", image:"" } }
Mais la sortie que j'obtiens est [0,0,0]
la sortie souhaitée est [0,1, 3]
.
Je pense que les promesses résoudront le problème, mais je ne sais pas comment les utiliserai dans ce cas imbriqué.
6 Réponses :
var allUsers = { "student_a":{ id:1, full_name:"ABC", address:"xyz", image:"image url" }, "student_b":{ id:2, full_name:"DEF", address:"", image:"image url" }, "student_c":{ id:3, full_name:"", address:"", image:"" } } var result = Object.keys(allUsers).map(student => Object.values(allUsers[student]).reduce((n, v) => { if(!v.toString().length) n += 1; return n },0)) console.log(result)
Parfait, le code ci-dessous fonctionne
var allUsers = { "student_a":{ id:1, full_name:"ABC", address:"xyz", email:"a@a.com", number:"1234567890", image:"image url" }, "student_b":{ id:2, full_name:"DEF", address:"", email:"random value", number:"000", image:"image url" }, "student_c":{ id:3, full_name:"", address:"", email:"", number:"", image:"" } }
mais il y a plus de problème, que se passe-t-il si le JSON est comme suit
var result = Object.keys(allUsers).map(student => Object.values(allUsers[student]).reduce((n, v) => { if(!v.toString().length) n += 1; return n },0))
et là est un e-mail et un numéro de téléphone et s'il est invalide, je le considère comme vide. Donc, dans le JSON ci-dessus, la sortie doit être [0,3,5] 3 champs vides pour student_b car l'adresse e-mail et le numéro de téléphone ne sont pas valides. Où met-il cette condition?
const allUsers= { "student_a":{ id:1, full_name:"ABC", address:"xyz", image:"image url" }, "student_b":{ id:2, full_name:"DEF", address:"", image:"image url" }, "student_c":{ id:3, full_name:"", address:"", image:"" } }; let arr=[]; Object.entries(allUsers).map(([key,val]) => { x= Object.values(val).reduce((count, cur) => { if(cur == ""){ return ++count; } return count; },0) arr.push(x); }); console.log(arr);
Cela fonctionnera correctement.
var data = { "student_a":{ id:1, full_name:"ABC", address:"xyz", image:"image url" }, "student_b":{ id:2, full_name:"DEF", address:"", image:"image url" }, "student_c":{ id:3, full_name:"", address:"", image:"" } } let output =[] for (let value of Object.values(data)) { var test = Object.values(value) var lucky = test.filter(function(number) { return number == ""; }); output.push(lucky.length) } console.log(output)
Comme vous souhaitez utiliser les promesses avec le problème ci-dessus, j'ai mis à jour votre code avec des promesses, jetez simplement un œil.
var allUsers = { "student_a": { id: 1, full_name: "ABC", address: "xyz", image: "image url" }, "student_b": { id: 2, full_name: "DEF", address: "", image: "image url" }, "student_c": { id: 3, full_name: "", address: "", image: "" } } check(allUsers); function check() { const promiseContainer = []; Object.entries(allUsers).map(([key, value]) => { promiseContainer.push(_validateStudent(value)); }); function _validateStudent(studentInfo) { let empty = 0; return new Promise((resolve, reject) => { Object.entries(studentInfo).map(([key, value]) => { if (value == "") { empty++ } }) resolve(empty); }); } Promise.all(promiseContainer).then((count) => { console.log(count) }); }
Pour ce format
Object.keys(allUsers).map(obj => allUsers[obj]).map(item => { item.email = /\S+@\S+\.\S+/.test(item.email) ? item.email : ""; // valid email or "" item.number = item.number ? item.number.match(/\d/g).length ===10 ? item.number : "" : item.number; //valid number or "" return item; }).map(item => Object.values(item).filter(innerItem => innerItem === "").length);
pour obtenir votre sortie [0,3,5
procédez comme suit:
XXX
cela affichera [0, 3, 5]
votre code renvoie
[0, 1, 3]
vérifier à nouveauNon ça dose pas je viens de revérifier
cliquez ici lien Démo