Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6中对象的高级分解_Javascript - Fatal编程技术网

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' }