Как легко получить не получающие свойства от объекта - PullRequest
2 голосов
/ 15 октября 2019

У меня есть объект, который выглядит так:

const obj = {
  x: 1,
  y: 2,
  foo() {
   return "foo";
  },
  get bar() {
    return "bar";
  }
}

Для простоты этот объект имеет только один метод получения, однако другие объекты могут иметь еще больше методов получения.

Есть ли простой способ получить свойства объекта так, чтобы он исключал все функции, а также все методы получения (методов)?

Мой желаемый результат:

const properties = ["x", "y"];

Я попытался использовать Object.keys(), однако это дает все свойства, включая все методы. Я также попытался просмотреть Object.getOwnPropertyNames(), однако это все равно включает все имена функций в результате.

Обратите внимание: Мне известно, что я могу отфильтровать получатели из результата getOwnPropertyNames(), сохранив где-то свой собственный набор получателей и проверив, включено ли свойство в этоустановлен. Тем не менее, это не кажется мне хорошим решением, так как между набором и свойствами объекта будет зависимость. Мне также известно, что я могу установить для атрибута enumerable метода значение false. Однако это потребует от меня сканирования всех методов в моем объекте и ручного выполнения этого. Есть ли более простой способ, который мог бы сделать это автоматически для достижения желаемого результата?

1 Ответ

5 голосов
/ 15 октября 2019

Используйте Object.getOwnPropertyDescriptors, чтобы получить объект с теми же ключами, значения которых являются дескрипторами. Используйте Object.entries, чтобы превратить объект в массив, .filter, чтобы отфильтровать дескрипторы с .value s (только дескрипторы данных; дескрипторы доступа, такие как дескрипторы с геттерами, не имеют .value s) и убедитесь, чтозначение тоже не функция. Затем .map на свои ключи:

const obj = {
  x: 1,
  y: 2,
  foo() {
   return "foo";
  },
  get bar() {
    return "bar";
  }
};

const output = Object.entries(Object.getOwnPropertyDescriptors(obj))
  .filter(([, desc]) => desc.hasOwnProperty('value') && typeof desc.value !== 'function')
  .map(([key]) => key);
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...