Как пробежаться по ключам объекта и проверить значения на пустоту?

Пытался сделать так, но это не работает

const obj = {
  name: 'user',
  surname: '',
}

const result = Object.values(obj).forEach(item => {
  if (item.length === 0) {
    return true;
  }
});
if (result) {
  console.log('Есть пустые значения');
} else {
  console.log('пустых значений нет');
}


Ответы (2 шт):

Автор решения: Ruslan Mart

const obj = {
    name: 'user',
    surname: '',
};

const result = Object.values(obj).some((item) => item === '');

console.log(result);

→ Ссылка
Автор решения: OPTIMUS PRIME

Правильный вариант уже предложили :) Касаемо цикла из вопроса: .forEach() не умеет останавливаться, всегда перебирает массив до конца и вызывает функцию для всех элементов. Возвращенные вызовами значения ни на что не влияют, а сам forEach всегда возвращает undefined

Если хочется вручную прервать перебор - используйте обычные циклы:

let obj = { name: 'user', surname: '' };

let result = false, values = Object.values(obj);

for (let i = 0; i < values.length; i++) {
  if (values[i].length == 0) {
    result = true;
    break;
  }
};

console.log(result);

/*****/

let hasEmptyValues = false;

for (let key in obj) {
  if (obj.hasOwnProperty(key) && obj[key].length == 0) {    
    hasEmptyValues = true;
    break;
  }
}

console.log(hasEmptyValues);

Проверку hasOwnProperty из второго цикла можно выкинуть, если гарантируется, что объект простой и ни от кого не наследует.


В виде функции получается чуть компактнее:

function hasEmptyValues(obj) {
  for (let val of Object.values(obj)) {
    if (!val) return true;
  }
  return false;
}

let test = { x: "" };
if ( hasEmptyValues(test) ) {
  console.log("!!!");
}

→ Ссылка