TLDR编辑:我混淆了带有数组的对象分解和扩展语法。下面的edit会技巧性地递归解压缩嵌套对象。
let nextLevel = Object.values(obj)
return goingDeep(...nextLevel)
以下是最初的问题,以防万一像我这样的菜鸟碰到这个问题,请帮助他们避免陷入困境; p
尝试解构嵌套对象将递归返回undefined。抛开这些简单地尝试将同一对象分解为不同的变量将返回未定义。
保持简单,只需假设每层有一个key:value(对象)即可,因此无需进行迭代。
const container = {container1: {container2 : {container3: {container4: 'core'}}}}
暂时将递归放在一边,只需两个不同的解构分配即可获得以下结果...
const {level1} = container
console.log(level1) // => container1: {container2:{ etc
const {level1_different} = container
console.log(level1_different) // => undefined
这是我尝试递归的方式
const goingDeep = (obj) => {
if (obj.hasOwnProperty('container4')){
obj.container4 = 'found'
return obj
} else {
// let {nextLevel} = obj /no good
// return goingDeep(nextLevel) /no good
let nextLevel = Object.values(obj)
return goingDeep(...nextLevel)
}
}
最初在参数goingDeep = ({obj})
处进行了结构分解,我已经成功地将其用于数组了,所以很明显我误解了对对象进行结构分解的基本要素
答案 0 :(得分:0)
let {nextLevel} = obj
与
相同let nextLevel = obj.nextLevel;
我认为您可能会误解破坏的作用。
要递归,您将需要动态搜索所有属性。
const goingDeep = obj => Object.getOwnPropertyNames(obj).reduce( (属性,结果)=>结果=== null? (obj [prop] ==='core'吗?obj:goingDeep(obj [prop])):结果,null );
答案 1 :(得分:0)
您的确误解了破坏的工作方式。如果有对象,则可以通过销毁来创建与对象中的属性同名的新变量。
let obj = {
prop1: 'value1',
prop2: 'value2',
};
let {prop1, prop2, prop3} = obj;
console.log(prop1, prop2, prop3)