javascript - 如何轻松地从对象中获取非 getter 属性

标签 javascript object ecmascript-6

我有一个看起来像这样的对象:

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

为了简单起见,这个对象只有一个 getter 方法,但是,其他对象可以有更多的 getter。

是否有一种简单的方法来获取对象的属性,从而排除所有函数以及所有 getter 方法?

我想要的结果是:

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

我试着研究使用 Object.keys() ,但是这给出了所有属性,包括所有方法。我也试过调查 Object.getOwnPropertyNames() ,但是,这仍然包括结果中的所有函数名称。

请注意:我知道我可以通过在某处维护我自己的一组 getter 并检查是否属性包含在该集合中。但是,这对我来说似乎不是一个很好的解决方案,因为集合和对象的属性之间存在依赖关系。我还知道我可以将方法的 enumerable 属性设置为 false。但是,这需要我扫描对象中的所有方法并手动执行此操作。有没有更简单的方法可以自动执行此操作以达到预期的结果?

最佳答案

使用Object.getOwnPropertyDescriptors 获取具有相同键的对象,其值是描述符。使用 Object.entries 将对象转换为数组,使用 .filter 过滤具有 .value 的描述符(仅数据描述符;访问描述符,就像那些有 setter/getter 的人一样,没有 .values) 并确保该值也不是函数。然后 .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);

关于javascript - 如何轻松地从对象中获取非 getter 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58387089/

相关文章:

javascript - 除非在页脚,否则 jQuery 不起作用

javascript - 灵活的 JavaScript 定时器

object - Lodash _.omit 函数在 map 内

javascript - 如何在 JSX 中循环尝试数据

javascript - 数组的不变性更新助手中的动态键

javascript - 在 ES6 中是否允许解构类实例属性?

javascript - 使用纯 CSS 创建轮播

javascript - 为什么这个 javascript 程序返回为未定义?

javascript - 如何增加foreach Angular 值?

python - 访问对象内存地址