Javascript ES6中对象的高级分解
我的目标如下:Javascript ES6中对象的高级分解,javascript,Javascript,我的目标如下: personObj = { _id : '123', first_name: 'John', last_name: 'Doe', } 我想将其分解为以下变量: id, <-- _id name: { first, <-- first_name last <-- last_name } 但是,这会导致错误。 我做错了什么?更新 本书的第二章提供了许多关于如何使用解构的高级示例,并解释了它是如何在内部工作的 分解结构可以将值直接提
personObj = {
_id : '123',
first_name: 'John',
last_name: 'Doe',
}
我想将其分解为以下变量:
id, <-- _id
name: {
first, <-- first_name
last <-- last_name
}
但是,这会导致错误。
我做错了什么?更新
本书的第二章提供了许多关于如何使用解构的高级示例,并解释了它是如何在内部工作的
分解结构可以将值直接提取到对象的属性中。属性不必存在,但在执行分解结构分配时,所有目标对象必须已经存在
有了这些知识,回答问题的代码是:
let personObj = {
_id: '123',
first_name: 'John',
last_name: 'Doe',
}
// Create the objects that receive the values on destructuring
let c = { name: {} }
// Do the magic
({ _id: c.id, first_name: c.name.first, last_name: c.name.last } = personObj)
console.log(c)
// {id: "123", name: {first: "John", last: "Doe"}}
需要使用分解结构的赋值表达式周围的括号,如果没有括号,引擎将在第一个:
处报告语法错误
最初的答案如下。它并没有完全回答这个问题,但我把它留在这里作为参考。它显示了如何在解构表达式中使用,并且OP接受了它,尽管它是不完整的
原始答案 另一种方法是:原始名称放在冒号之前,新名称放在冒号之后
let personObj = {
_id: '123',
first_name: 'John',
last_name: 'Doe',
}
// Destructure personObj using different names for the properties
const {
_id: id,
first_name: first,
last_name: last
} = personObj
console.log('id: ' + id);
console.log('first: ' + first);
console.log('last: ' + last);
// Output
// id: 123
// first: John
// last: Doe
然后,您可以将这些片段(id
,第一个
,最后一个
)组合成一个新对象:
let c = {
id,
name: {
first,
last
}
}
console.log(c);
// Output
// { id: '123', name: { first: 'John', last: 'Doe' } }
更新 与您在问题中描述的最相似的结果可以通过以下方式实现:
let { _id: id, ...name } = personObj
console.log(id)
console.log(name)
// Output
// 123
// { first_name: 'John', last_name: 'Doe' }
但是通过这种方式,
name
的属性使用与personObj
中相同的名称。更重要的是,如果你在last\u name
之后添加你不想在name
中复制的personObj
属性,它就不再起作用了,我知道解构很花哨,但是var id=personObj有什么问题吗?\u id,name={first:personObj.first\u name,last:personObj.last\u name}代码>?没有错,但我也想知道es6语法是如何实现的。另一种方法是:原来的名字放在冒号之前,新名字放在冒号之后。谢谢你的详细回答!
let { _id: id, ...name } = personObj
console.log(id)
console.log(name)
// Output
// 123
// { first_name: 'John', last_name: 'Doe' }