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

Как можно более эффективно проверить объект на наличие только разрешенных ключей из предопределенного списка? Например, у нас есть стандартный объект с определенными ключами ["v", "c", "g"], и нам необходимо убедиться, что объект содержит только один из этих разрешенных ключей. Метод сортировки и ручная проверка может быть неэффективным, есть ли другие способы решения этой задачи?
  • 9 марта 2024 г. 19:48
Ответы на вопрос 2
Для определения наличия ключа в объекте, о котором заранее неизвестно, можно воспользоваться методом hasOwnProperty() или оператором in. 

Пример для hasOwnProperty():
```javascript
const obj = {
  key1: 'value1',
  key2: 'value2'
};

const keyToCheck = 'key1';

if(obj.hasOwnProperty(keyToCheck)) {
  console.log(`Ключ ${keyToCheck} существует в объекте`);
} else {
  console.log(`Ключ ${keyToCheck} не существует в объекте`);
}
```

Пример для оператора in:
```javascript
const obj = {
  key1: 'value1',
  key2: 'value2'
};

const keyToCheck = 'key1';

if(keyToCheck in obj) {
  console.log(`Ключ ${keyToCheck} существует в объекте`);
} else {
  console.log(`Ключ ${keyToCheck} не существует в объекте`);
}
```

Для эффективной проверки объекта на наличие только разрешенных ключей из предопределенного списка можно воспользоваться методом Object.keys() для получения массива ключей объекта, и сравнить его с предопределенным списком разрешенных ключей. 

Пример:
```javascript
const obj = {
  v: 'value1',
  x: 'value2'
};

const allowedKeys = ['v', 'c', 'g'];

const keys = Object.keys(obj);

const hasOnlyAllowedKeys = keys.every(key => allowedKeys.includes(key));

if(hasOnlyAllowedKeys) {
  console.log('Объект содержит только разрешенные ключи');
} else {
  console.log('Объект содержит недопустимые ключи');
}
```

Этот подход позволяет эффективно проверить объект на наличие только разрешенных ключей из предопределенного списка без необходимости использования сортировки или ручной проверки.
function isPermittedObject(obj) {
  if (!obj) return false;
  
  const permitted = new Set(["v", "c", "g"]);
  let max = 1;

  for (const key in obj)
    if (!permitted.has(key) || !max--) 
      return false;
  return true;
}

console.log(!isPermittedObject({
  v: 1,
  c: 3,
  g: 5
}))

console.log(!isPermittedObject({
  v: 1
}))
Похожие вопросы