0

假设我有以下对象:

let filters = {
  brands: { ... },
  price: { ... },
  sizes: { ... },

  ...
}

对象的属性filters将由用户设置。这意味着有时filters对象可能只包含brands,有时它可能包含brands&price等等。

我编写了以下函数来从filters对象中提取特定属性:

let extractProperty = (propertyName) => {
  ({ propertyName, ...rest } = filters);  // <-- propertyName isn't working here
  console.log(propertyName);
}

extractProperty("brands");

如果我调用上述函数,控制台会显示undefined. 谁能指出我在这里缺少什么?

CodePen 链接

笔记:

我已经使用lodash.omit方法解决了这个问题。但是我仍然很想知道为什么函数参数值在对象解构中不起作用。

不重复:

  1. 这个问题是关于传递默认值
4

2 回答 2

4

该代码正在寻找一个名为 的属性propertyName,从字面上看。要将值 inpropertyName用作属性名称,您需要使用计算表示法,并且您需要指定将属性值放在何处。例如,将其放入现有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牺牲品创建一个全局变量。

于 2020-09-23T06:39:17.827 回答
0

当您只想获得一个属性时,为什么要在这里使用解构?

let filters = {
  brands: { value:'b' },
  price: { value:'p' },
  sizes: { value:'s' },
}

let extractProperty = propertyName =>
  console.log(filters[propertyName])

extractProperty("brands");

于 2020-09-23T06:58:20.270 回答