问题描述
让我们假设我有以下对象:
let filters = {
brands: { ... },price: { ... },sizes: { ... },...
}
filters
对象的属性将由用户设置。这意味着有时filters
对象可能只包含brands
,有时它可能包含brands
和price
,依此类推。
let extractProperty = (propertyName) => {
({ propertyName,...rest } = filters); // <-- propertyName isn't working here
console.log(propertyName);
}
extractProperty("brands");
如果我调用上述功能,控制台将显示undefined
。
谁能指出我在这里缺少的东西吗?
注意:
我已经使用lodash.omit方法解决了此问题。但是我仍然很想知道为什么函数参数值不能在对象分解中起作用。
不重复:
解决方法
从字面上看,该代码正在寻找一个名为propertyName
的属性。要将propertyName
中的值用作属性名称,您需要使用计算符号,并且需要指定将属性值放在何处。例如,将其放入现有的example
变量中:
let extractProperty = (propertyName) => {
({ [propertyName]: example,...rest } = filters);
// ^−−−−−−−−−−−−^^^^^^^^^^
console.log(example);
};
extractProperty("brands");
您的代码是在假设rest
已经存在的情况下编写的,但是我怀疑您真的想在本地声明它,以及用于接收属性值的变量:
let extractProperty = (propertyName) => {
const { [propertyName]: example,...rest } = filters;
console.log(example);
};
extractProperty("brands");
如果没有const
,let
(或var
,但不推荐使用var
),除非您在封闭范围内声明了rest
,否则该代码将要么失败ReferenceError
(在严格模式下),要么沦为我所谓的The Horror of Implicit Globals(宽松模式),自动创建一个全局变量。
为什么只想获得财产时在这里使用销毁?
let filters = {
brands: { value:'b' },price: { value:'p' },sizes: { value:'s' },}
let extractProperty = propertyName =>
console.log(filters[propertyName])
extractProperty("brands");