【问题标题】:Loop through a nested map in immutable js循环遍历不可变 js 中的嵌套映射
【发布时间】:2017-03-17 15:31:52
【问题描述】:

我是 javascript 新手,我想使用不可变 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"
                }
            }
        }
    })

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

【问题讨论】:

    标签: javascript iteration immutable.js


    【解决方案1】:

    我不确定一旦你有了这些数组你想做什么,所以在这个例子中我只是将它们显示在一个 HTML 标记中。但是,这应该向您展示如何创建您正在寻找的每个数组。第一步是使用 Array.from(clients.keys()); 获取客户端 ID 数组;称呼。在此之后,您在 clients.getIn() 调用中使用客户端 ID,该调用为每个客户端返回一个标准 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>

    【讨论】:

    • 太棒了!谢谢!
    • 我这里有个小问题...我尝试 console.log 投资组合数组但是 var portfolio_array = Object.keys(obj.portfolios);显示投资组合未定义的错误
    • 我找到了正确的答案。我使用 const obj = clients.getIn([clientsIdArray[0], 'portfolios']);然后 const portArray = obj.keySeq().toArray()
    • 您是在使用与原始问题中显示的相同的 Map 初始化,还是使用 Immutable.fromJS() 之类的东西创建更深层次的不可变对象?这两种方法需要不同的方法。
    • 我正在创建一个更深层次的不可变对象。更不用说这是一个错误..
    猜你喜欢
    • 2014-02-27
    • 2019-11-08
    • 2021-11-22
    • 2017-03-21
    • 2018-05-23
    • 2023-03-15
    • 2021-11-20
    • 2011-01-09
    • 2018-02-11
    相关资源
    最近更新 更多