首页 > 解决方案 > 如何在有或没有 lodash 的情况下正确迭代和解析 javascript 中的嵌套对象

问题描述

我目前正在开发一项返回以下有效负载的服务:

{
  "account1": {
    "app1": {
      "status": "Online",
      "comments": "blah blah",
      "events": [
        {
          "date": "some date",
          "generated_by": "some user"
        }
      ]
    }
  },
  "account2": {
    "app1": {
      "status": "Offline",
      "comments": "blah blah bleh",
      "events": [
        {
          "date": "some date",
          "generated_by": "some user"
        }
      ]
    },
    "app2": {
      "status": "Online",
      "comments": "blah blah",
      "events": [
        {
          "date": "some date",
          "generated_by": "some user"
        }
      ]
    }
  }
}

我正在尝试使用以下字段呈现表格:

-------------------------------
Application | Account  | Status
-------------------------------
app1        | account1 | Online
app1        | account2 | Offline
app2        | account2 | Online    

通常,如果我的有效负载类似于对象列表,那么这很容易做到,但我有点卡在这里。

我尝试通过提取每个字段并通过执行以下操作创建新的有效负载来规范化此有效负载:

const extractAccountNumber = Object.values(payload).map(account => ({account: account}))

这将返回:

[
  {
    "account": "account1"
  },
  {
    "account": "account2"
  }
]

我想以相同的方式继续使用应用程序名称,一旦获得所有字段,我将合并有效负载。这已被证明是超级麻烦的,我确信有一种更好、更有效的方法来实现这一点,而我可能错过了这一点。任何反馈都会帮助我理解如何使用带有或不带有 lodash 的 javascript 来实现这一点。

标签: javascriptlodash

解决方案


按第一级迭代,然后按第二级迭代:

table = [];
for (accountName in apiResponse) {
    account = apiResponse[accountName];
    for (appName in account) {
        app = account[appName];
        table.push({
            application: appName,
            account: accountName,
            status: app.status,
        });
    }
}

那么表是这样的:

[
    {
        "application": "app1",
        "account": "account1",
        "status": "Online"
    },
    {
        "application": "app1",
        "account": "account2",
        "status": "Offline"
    },
    {
        "application": "app2",
        "account": "account2",
        "status": "Online"
    }
]

推荐阅读