У меня есть объект JavaScript с ключами и значениями. Мне нужно проверить значения этого объекта, и если он содержит значение «пусто», я хочу выдать предупреждение. Я хочу дать предупреждение только один раз, даже если было несколько «пустых» значений.
Я пробовал так;
data = [
{first_name: 'John', last_name: 'Doe'},
{first_name: 'Kiki', last_name: 'empty'},
{first_name: 'Kim', last_name: 'empty'},
]
data.forEach(function(value){
if (value.last_name == 'empty'){
alert('Please fill all the field');
return false;
}
});
Это может подтвердить значение, но дважды выдает предупреждение.
Я хочу показать предупреждение только один раз. Как я могу это сделать?
Используйте some
:
const data = [{
first_name: 'John',
last_name: 'Doe'
},
{
first_name: 'Kiki',
last_name: 'empty'
},
{
first_name: 'Kim',
last_name: 'empty'
},
];
if (data.some(e => Object.values(e).some(f => f == "empty"))) {
alert("There is an empty value");
}
Если вы хотите показать и другие данные (например, какое свойство в каком индексе), вы можете использовать другие параметры в функции обратного вызова:
const data = [{
first_name: 'John',
last_name: 'Doe'
},
{
first_name: 'Kiki',
last_name: 'empty'
},
{
first_name: 'Kim',
last_name: 'empty'
},
];
if (data.some(e => Object.values(e).some(f => f == "empty"))) {
let index = data.findIndex(e => Object.values(e).some(f => f == "empty"));
let [property] = Object.entries(data[index]).find(([k, v]) => v == "empty");
alert(`The property ${property} at index ${index} is empty.`);
}
Он дважды предупреждает вас, один раз для Кики и один раз для Ким. Если вы хотите остановить цикл после первого появления, вам нужно изменить «return false» на «break» следующим образом:
data.forEach(function(value){
if (value.last_name == 'empty'){
alert('Please fill all the field');
break;
}
});
Кроме того, ваш JSON вернется с нулевым значением, если он будет пустым, а не пустой строкой, как в вашем примере. Итак, ваш пример проверяет кого-то, у кого фамилия «пустая», а не того, кто оставил ее пустой.
Вы можете использовать функцию some
, чтобы проверить, является ли хотя бы один объект last_name === 'empty'
const data = [{first_name: 'John',last_name: 'Doe'},{first_name: 'Kiki',last_name: 'empty' },{first_name: 'Kim',last_name: 'empty'}];
// The function some returns true
// if at least one object meets the predicate 'last_name === "empty"'.
if (data.some(({last_name}) => last_name === "empty")) alert("There is an empty value");
Я думаю, что цикл может быть удобен в такой ситуации.
let data = [
{first_name: 'John', last_name: 'Doe'},
{first_name: 'Kiki', last_name: 'empty'},
{first_name: 'Kim', last_name: 'empty'},
]
// data.forEach(function(value){
// if (value.last_name == 'empty'){
// alert('Please fill all the field');
// return false;
// }
// });
for(let i of data) {
if (i.last_name == "empty") {
alert('Please fill all the field');
break;
}
}
Большое спасибо! Второй код значительно улучшил мою программу!