Реагировать на встроенный цикл вложенных объектов с обещанием - PullRequest
0 голосов
/ 11 января 2019

У меня есть объект JSON следующим образом

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:""
        }
    }

В приведенном выше JSON мне нужно выяснить, сколько пустых полей в каждом ученике.

Я использую следующий код

_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
        }

Но вывод, который я получаю, - [0,0,0], желаемый вывод - [0,1,3]. Я думаю, что обещания решат проблему, но я не знаю, как я буду использовать их в этом вложенном случае.

Ответы [ 6 ]

0 голосов
/ 11 января 2019

Для этого формата

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:""
    }
}

чтобы получить вывод [0,3,5]

сделать это:

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);

это напечатает [0, 3, 5]

живая демоверсия

0 голосов
/ 11 января 2019

Поскольку вы хотите использовать обещания с вышеуказанной проблемой, я обновил ваш код обещаниями, просто посмотрите.

    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) });
    }
0 голосов
/ 11 января 2019

Это будет работать правильно.

 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)
0 голосов
/ 11 января 2019

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);
0 голосов
/ 11 января 2019

Отлично работает приведенный ниже код

var result = Object.keys(allUsers).map(student => Object.values(allUsers[student]).reduce((n, v) => {
    if(!v.toString().length) n += 1;
    return n
},0))

но есть еще проблема, что если JSON выглядит следующим образом

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:""
        }
    }

и есть адрес электронной почты и номер телефона, и в случае недействительности я считаю его пустым. Таким образом, в приведенном выше JSON результат должен быть [0,3,5] 3 пустых поля для student_b как адрес электронной почты и номер телефона недействительны. Куда это положило это условие?

0 голосов
/ 11 января 2019

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...