在地图的箭头函数中作为参数传递的对象中的键值分配

时间:2019-02-11 12:02:41

标签: javascript ecmascript-6 arrow-functions

在下面的代码中,我在map函数中传递了一个对象数组。 category的值被分配给categoryName,并作为categoryName返回。我的问题是了解分配操作。对对象属性的分配不是通过key:value的方式发生的吗?相反,我看到category的值以value:key

的方式分配给了这个新变量
const companies= [
  {name: "Company One", category: "Finance"},
  {name: "Company Two", category: "Retail"}
];
const companyu = companies.map(
({ name, category: categoryName }) => ({ name, categoryName }))

3 个答案:

答案 0 :(得分:1)

当您仅在对象{value}中提供一个值时,属性将与变量名称相同(变量名称用作键的占位符

let a = 'Value'
console.log({a})

如果要定义其他名称,可以通过定义来实现。

let a = 'value'
console.log({key: a})

  

我的问题更多是针对以下部分类别:categoryName。我知道了   该categoryName被分配了category的值。这个怎么样   发生了吗?

let var1 = {a:1}
let {a} = var1

与    让var1 = {a:1}    让a = var1.a

这个是

let var1 = {a:1}
let {a:b} = var1

相同
let var1 = {a:1}
let b = var1.a

enter image description here

答案 1 :(得分:1)

{ name, category: categoryName }尽管看上去完全像一个对象文字,却不是一个。当在期望使用表达式的地方(例如let x = { name, category: categoryName };编写时,该语法会创建一个对象,但是在期望使用参数名称的地方(例如function foo({ name, category: categoryName }) {}和您的示例)编写时,它会破坏对象。

解构是您可以read讨论的整个主题,但要旨是,您编写一个带有一些名称的模式而不是一个名称,并将该模式​​应用于给定值以设置所有模式的名称。所以,这

const {a, b} = obj;

等效于此

const a = obj.a;
const b = obj.b;

此外,如果您要使用与道具名称不同的变量名,则可以这样做

const {a, b: c} = obj;

等效于

const a = obj.a;
const c = obj.b;

这就是您的{ name, category: categoryName }在这里所做的事情。

答案 2 :(得分:0)

此功能自ES6(或ES2015)起可用,称为简写符号。

如果要定义一个对象,其键的名称与作为属性传入的变量的名称相同,则可以使用速记并简单地传递键名称

在ES5(较旧的语法)中,我们需要使用您所说的key:value。一个例子:

var name = 'John';
var surname = 'Matthew';
var age = 45;

var myObject = {
  name : name,
  surname : surname,
  age : age
};

console.log(myObject);

在ES6 +(或ES2015 +)中,如果要将属性的名称保留为传入的变量,则无需使用key:value。像这样:

let name = 'John';
let surname = 'Matthew';
let age = 45;

let myObject = {
  name,
  surname,
  age
};

console.log(myObject);