Поиск и проверка в объектах

Поиск и проверка в объектах

Технический фундамент проверок объекта

Проверки в объектах бывают двух типов:

  • проверка наличия ключа;
  • получение структуры для обхода (keys/values/entries).
const user = { id: 1, name: 'Ann' };

console.log('id' in user); // true
console.log(Object.hasOwn(user, 'name')); // true
console.log(Object.keys(user)); // ['id', 'name']

Ключевой момент: корректная проверка структуры всегда идет до бизнес-логики, а не после падения на undefined.

Проверка наличия ключа: in

Оператор in проверяет, есть ли ключ в объекте.

const user = { id: 1, name: 'Ann' };

console.log('name' in user); // true
console.log('email' in user); // false

hasOwnProperty

Метод hasOwnProperty проверяет только собственные свойства объекта.

console.log(user.hasOwnProperty('id')); // true
console.log(user.hasOwnProperty('toString')); // false

Смотри, что важно: in может учитывать свойства из прототипа, а hasOwnProperty — нет.

Еще один нюанс: вызывать obj.hasOwnProperty(...) не всегда безопасно (метод могут переопределить, или его может не быть, например у объекта с Object.create(null)). Поэтому чаще используют:

console.log(Object.hasOwn(user, 'id')); // true
console.log(Object.prototype.hasOwnProperty.call(user, 'id')); // true

Получение ключей и значений

Object.keys(obj) возвращает массив ключей, Object.values(obj) — массив значений.

const settings = { theme: 'dark', lang: 'ru' };

console.log(Object.keys(settings)); // ['theme', 'lang']
console.log(Object.values(settings)); // ['dark', 'ru']

Пары ключ-значение: Object.entries

console.log(Object.entries(settings));
// [['theme', 'dark'], ['lang', 'ru']]

Это удобно, когда нужно пройтись циклом по объекту.

for (const [key, value] of Object.entries(settings)) {
  console.log(`${key}: ${value}`);
}

Проверь себя: что вернет Object.keys({})?

Микро-сценарии

  1. Проверка обязательных полей ответа API.
function hasRequiredUserFields(data) {
  return 'id' in data && 'name' in data;
}
  1. Рендер настроек в UI как список.
const rows = Object.entries(settings).map(([k, v]) => `${k}: ${v}`);

Типичные ошибки

  • Проверять наличие через if (obj.key), когда значение может быть 0 или ''.
  • Путать in и hasOwnProperty.
  • Забывать, что Object.keys возвращает массив строк.
  • Не учитывать пустой объект.

Краткий итог

  • in и hasOwnProperty решают задачу проверки ключей.
  • Object.keys/values/entries помогают анализировать объект.
  • Проверка структуры данных обязательна перед использованием.
  • Не путай «ключ отсутствует» и «значение falsy».
  • Грамотные проверки уменьшают runtime-ошибки.