JS中的对象解析 - 嵌套对象

时间:2017-09-15 11:21:54

标签: javascript node.js destructuring

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

例如。

我有一个xhr req,返回String time1 = "09-00 AM"; String time2 = "07-00 PM"; public static void main(String[] args) { try { DateFormat df = new SimpleDateFormat("HH:mm:SS"); Date time1 = df.parse("09-00 AM"); Date time2 = df.parse("07-00 PM"); Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); sf.format(date); TimeZone tz1 = TimeZone.getTimeZone("PST"); Date c = shiftTimeZone(date, tz1); System.out.println("Format : " + new SimpleDateFormat("HH:mm:SS").format(c)); System.out.println(time1 + "" + time2); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); }

例如:{person: user: {}}

我只对用户部分感兴趣,所以我要破坏。

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

const {person: {user}} = xhrResponse

然而,如果api返回console.log(user) => 'hi'

,该怎么办?

我的解构失败了{person: null}

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

解决方案

Cannot match against 'undefined' or 'null'.

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

更完整的用例:

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

3 个答案:

答案 0 :(得分:2)

您也可以为嵌套内容添加默认值:

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

handleResponse({});

(我假设您根据箭头功能使用es6)

edit:sry,仅适用于未定义的值,但如果值为null则不起作用 无论如何,这将留下答案,因为它可能对其他读者有用

答案 1 :(得分:2)

你能用这个吗?

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

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

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

答案 2 :(得分:1)

就个人而言,我希望清楚地看到我的功能正在接收的参数。

我会选择这个解决方案:

#include<stdio.h>

int main()
{
    int arr[2] = {1, 2};
    void *ptr = &arr;
    ptr = ptr + sizeof(int);
    printf("%d\n", *(int *)ptr);
    return 0;
}

进行繁琐的解构可以以不可读的代码结束

所以做渐进式解构,对我来说感觉更好。