JS嵌套对象中的解构对象

我如何处理解构可能有一个未定义的内部对象的嵌套对象?

例如。

我有一个xhr req返回{person: user: {}}

例如: const xhrResponse = {person: user: 'hi'}}

我只对用户部分感兴趣,所以我毁了。

const {person: {user}} = xhrResponse

console.log(user) => 'hi'

但是,如果api返回{person: null}

我的解构失败, Cannot match against 'undefined' or 'null'.

我有一个解决scheme,但我觉得可能有一个更优雅的解决scheme。

const handleResponse(res) => res.person ? res : {person: user: {}}

有没有更好的方法来处理这个问题? 或者甚至另一种说法,更好地使用这个词有时是意见的同义词:D

更完整的使用案例:

 $q.all([somePromise, someOtherPromise, getPersonPromise]) .then(promises => [vm.promise1, vm.promise2, {person: {user: vm.user}] = promises); 

你能用这个吗?

 const {user} = xhrResponse.person || {}; 

对于更新的用例,我想知道这是否可行?

 $q.all([ somePromise, someOtherPromise, getPersonPromise.then(res => (res.person || {}).user) ]).then(promises => [vm.promise1, vm.promise2, vm.user] = promises); 

您也可以为嵌套的东西添加默认值:

 const handleResponse = ({ person: { user = {}} = {}} = {}) => { console.log(user); } handleResponse({}); 

(我假设你使用es6基于你的箭头function)

编辑:sry,只适用于未定义的值,但如果值为null将不会在这里留下答案,因为它可能对其他读者有用

我个人喜欢清楚地看到我的function正在接受的参数。

我会去解决这个问题:

 const handleResponse = (response) => { const { person: { user } = {} } = response || {}; // since user is the value to be used you don't need to set a default unless you need it if (user) // do your stuff here } 

做繁琐的解构可能以不可读的代码结束

所以做进步解构,感觉像是一个更好的解决scheme。