循环遍历不可变js中的嵌套地图

Loop through a nested map in immutable js

我是 javascript 的新手,我想使用 immutable js 完成一项任务。 我有一张这样的地图:

const clients = Map({
        "c1": {
            "id": "c1",
            "isLegalEntity": false,
            "wantsEstatements": true,
            "portfolios": {
                "a": {
                    "id": "a",
                    "type": "Cash"
                },
                "b": {
                    "id": "b",
                    "type": "Margin"
                }
            }
        },
        "c2": {
            "id": "c2",
            "isLegalEntity": false,
            "wantsEstatements": true,
            "portfolios": {
                "e": {
                    "id": "e",
                    "type": "Cash"
                },
                "f": {
                    "id": "f",
                    "type": "Margin"
                }
            }
        }
    })

我想创建三个 table。第一个 table 将包含 "c1" 和 "c2" 值,因此根据我阅读的文档,我使用 clients.keys() 属性。 另一个 table 必须包含所有投资组合 ID,如下所示:["e"、"f"],最后一个 table 必须包含所有投资组合类型,如下所示:["cash", "margin"] 但我不知道如何从文档中执行此操作。你知道怎么做吗?

我不确定您拥有数组后想要做什么,因此在本例中我只是将它们显示在 HTML 标记中。但是,这应该向您展示如何创建您要查找的每个数组。第一步是使用 Array.from(clients.keys()); 获取客户端 ID 数组;称呼。此后,您在 clients.getIn() 调用中使用客户端 ID,其中 returns 每个客户端的标准 javascript 对象。在此之后,您可以使用标准的 javascript 对象访问方法从客户端对象构建您想要的数组。

var clients = Immutable.Map({
  "c1": {
    "id": "c1",
    "isLegalEntity": false,
    "wantsEstatements": true,
    "portfolios": {
      "a": {
        "id": "a",
        "type": "Cash"
      },
      "b": {
        "id": "b",
        "type": "Margin"
      }
    }
  },
  "c2": {
    "id": "c2",
    "isLegalEntity": false,
    "wantsEstatements": true,
    "portfolios": {
      "e": {
        "id": "e",
        "type": "Cash"
      },
      "f": {
        "id": "f",
        "type": "Margin"
      }
    }
  }
});

function logArray(arr) {
  var str = "[";
  for (var i = 0; i < arr.length; i++) {
    str += arr[i];
    if (i < arr.length - 1) str += ",";
  }
  str += "]"
  document.getElementById("info").innerHTML += str + "<br>";
}

var client_id_array = Array.from(clients.keys());
logArray(client_id_array);
for (var i = 0; i < client_id_array.length; i++) {
  var obj = clients.getIn([client_id_array[i]]);
  var portfolio_array = Object.keys(obj.portfolios);
  logArray(portfolio_array);
  var types = [];
  for (j = 0; j < portfolio_array.length; j++) {
    types[j] = obj.portfolios[portfolio_array[j]].type;
  }
  logArray(types);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.7.5/immutable.js"></script>

<div id="info"></div>