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。