JavaScript 对象解构技巧

104 阅读3分钟

关于 JavaScript,我们得到了一种从对象中提取属性的非常有用的方法。

   解构辅助也可以使用于数组,但是大多是还是对对象使用

假设我们有一个用户对象并且想要提取各个变量的属性。

const user = {
  name: 'Chris',
  age: 33,
};

在 ES2015 之前,我们必须像这样显式地分配这些变量:

let name = user.name;

这仍然适用于现代 JavaScript。但是,它可以进行优化。我们可以省略name属性的双重使用绑定并像这样解构属性。

const { name, age } = user;

console.log(name);
// Chris

console.log(age);
// 33

我们不必重复命名变量,可以直接将它们分配给它们的变量。

解构并保留一个rest对象

假设您有一个具有多个字段的对象。您希望提取其中一个字段,并跟踪剩余的内容。

您可能认为我们需要对所有剩下的属性赋值,但这是通过使用spread操作符内置的。

const user = {
  name: 'Chris',
  age: 33,
  username: 'DailyDevTips',
};

const { name, ...rest } = user;

console.log(name);
// Chris

console.log(rest);
// { age: 33, username: 'DailyDevTips' }

分解嵌套的对象属性

通常,你的对象会有多个层。通过解构,我们还可以针对嵌套属性。

const user = {
  name: 'Chris',
  age: 33,
  username: 'DailyDevTips',
  address: {
    country: 'South Africa',
    postalCode: '7700',
  },
};

让我们以上面的例子为例。我们怎么能一口气把这个国家抽走?

const {
  address: { country },
} = user;

console.log(country);
// South Africa

但是如果我们想提取整个地址对象和国家,会发生什么呢?

在上面的例子中,如果我们试图记录地址,它会说:ReferenceError: address未定义。

然而,我们可以像这样简单地在解构中传递另一个引用:

const {
  address: { country },
  address,
} = user;

console.log(address);
// { country: 'South Africa', postalCode: '7700' }

console.log(country);
// South Africa

使用不同的名称进行解构

也许您想在不同的名称下解构某些属性。

让我们以上面的例子为例,声明我们希望接收名为shippingAddress的地址对象。

我们可以使用分号:分隔符来处理新名称。

const { address: shippingAddress } = user;

console.log(shippingAddress);
// { country: 'South Africa', postalCode: '7700' }

这是创建可以直接使用的变量的好方法。

解构可能为空的值

让我们重新获取我们的用户对象,我们已经解构了age,但我忘了说这是一个可选参数。

有些用户可能选择不设置它。在这种情况下,我们可以使用默认值。

注意:这对于age属性来说有点奇怪,所以将其作为一个示例
const user = {
  name: 'Chris',
  age: 33,
};

const { age } = user;

console.log(age);
// 33

这很好,但让我们看看没有age属性的用户。

const user = {
  name: 'Yaatree',
};

const { age } = user;

console.log(age);
// undefined

如果想设置默认年龄,可以用一个值来解构它。

const { age = 25 } = user;

console.log(age);
// 25

在循环中解构

上述所有示例都基于平面对象,但大多数情况下,您将拥有一个用户数组。

const users = [
  {
    name: 'Chris',
    age: 33,
  },
  {
    name: 'Yaatree',
    age: 2,
  },
];

我们可以循环遍历这些项,并在循环中解构它们。

for (let { name, age } of users) {
  console.log(`User: ${name} is ${age} years old 🎉`);
}

// 'User: Chris is 33 years old 🎉'
// 'User: Yaatree is 2 years old 🎉'

动态名称解构

当我们只知道要在运行时分解的变量时,会发生什么?

假设用户单击一个按钮,该按钮允许他们从对象中提取一个随机属性。

该处理程序将具有以下属性。

const getProperty = 'name'; 
//   我们怎么从用户那里得到这个呢?

要使用它,我们可以使用方括号注释。

const { [getProperty]: returnValue } = user;

console.log(returnValue);
// Chris

从函数中解构

假如我们有一个返回对象的函数

const getProduct = () => {
  return {
    id: 1,
    name: 'Macbook',
  };
};

如果我们调用他

const product = getProduct();

console.log(product);
// { id: 1, name: 'Macbook' }

但是我们只要id我们可以这样做

const { id } = getProduct();

console.log(id);
// 1