函数参数值在JS中的对象分解中不起作用

问题描述

让我们假设我有以下对象:

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

filters对象的属性将由用户设置。这意味着有时filters对象可能只包含brands,有时它可能包含brandsprice,依此类推。

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

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

extractProperty("brands");

如果我调用上述功能,控制台将显示undefined。 谁能指出我在这里缺少的东西吗?

CodePen Link

注意:

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

不重复:

  1. This question is about passing default value

解决方法

从字面上看,该代码正在寻找一个名为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");

如果没有constlet(或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");

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...