Shn*_*ick 2 javascript object ecmascript-6
我有一个看起来像这样的对象:
const obj = {
x: 1,
y: 2,
foo() {
return "foo";
},
get bar() {
return "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,此对象仅具有一个吸气剂方法,但是其他对象可以具有更多吸气剂。
是否有一种简单的方法来获取对象的属性,使其排除所有功能以及所有getter方法?
我想要的结果是:
const properties = ["x", "y"];
Run Code Online (Sandbox Code Playgroud)
我尝试使用Object.keys(),但这提供了所有属性,包括所有方法。我也尝试研究了Object.getOwnPropertyNames(),但是,结果中仍然包括所有函数名称。
请注意:我知道我可以getOwnPropertyNames()通过在某个地方维护自己的一组getter来检查结果中的getter,并检查属性是否包含在该set中。但是,这对我来说似乎不是一个很好的解决方案,因为在集合和对象的属性之间会存在依赖关系。我也知道我可以将方法的enumerable属性设置为false。但是,这将需要我扫描对象中的所有方法并手动执行此操作。有没有一种更简单的方法也许可以自动执行此操作以达到所需的结果?
使用Object.getOwnPropertyDescriptors获取对象相同的按键,其值是描述符。使用Object.entries打开对象到一个数组,.filter以过滤器用于与描述符.valueS(仅数据描述符;描述符访问器,如那些具有吸气剂,没有.value或多个)和确保该值不是函数要么。然后.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);Run Code Online (Sandbox Code Playgroud)