【问题标题】:How to convert a nested for loop to a declarative statement in javascript如何将嵌套的for循环转换为javascript中的声明性语句
【发布时间】:2015-07-28 05:48:37
【问题描述】:

使用map、filter、reduce等函数式方法,如何将嵌套的for循环转换为声明式函数。以下面为例:

getTxns: function () {
    var txnsToCheck = [];
    var pages = this.data;
    for (var i = 0; i < pages.length; i++) {
        var page = pages[i];
        var txns = [];
        for (var j = 0; j < page.txns.length; j++) {
            if (page.txns[j].grade) {
                txnsToCheck.push({ page: i, txn: j, virtual: false });
        }
        else {
            txnsToCheck.push({ page: i, txn: 0, virtual: true });
        }
    }

    return txnsToCheck;
},

以下是功能重写的无效尝试,最后一张地图不起作用,但我相信说明了意图,这是一个条件分配。

getTxns: function () {
    return this.data.
        map(function (page) {
            return page.txns.
                map(function(txn){
                    if (txn.grade){
                        return {page: txn.page_idx, txn: page.txns.indexOf(txn), virtual: false}
                    } else {
                        return {page: txn.page_idx, txn: 0, virtual: true}
        }
    })
})

我考虑过过滤器,但不清楚您是否可以在一次操作中遍历链进行第二个过滤器和映射?

想知道 for 循环的工作声明式版本是什么样的。

以下是数据架构的示例:

"derived": [
  {
    "page_idx": 0,
    "page_image_url": "",
    "doc_pk": 123456,
    "txns": [
      {
        "page_idx": 0,
        "grade": 0,
        "explanation": "test 1",
        "id": 1962754,
      },
      {
        "page_idx": 0,
        "is_recurring": false,
        "bank_account_pk": null,
        "grade": 0,
        "explanation": "test 2",
        "id": 1962753,
      },
   ]
  },
  {
    "page_idx": 1,
    "page_image_url": "",
    "doc_pk": 2654321,
    "txns": []
  },
  {
    "page_idx": 2,
    "page_image_url": "",
    "doc_pk": 123457,
    "txns": []
  }
]

【问题讨论】:

  • 看起来你想要一个平面地图。您可以使用reduce 来实现它。

标签: javascript functional-programming


【解决方案1】:

@eclanrs 提到的可能看起来像这样

getTxns: function () {
    return this.data.reduce(function (accumulator, page) {
        return accumulator.concat(page.txns.map(function(txn){ 
                return {
                    page: txn.page_idx,
                    txn: txn.grade ? page.txns.indexOf(txn) : 0,
                    virtual: !txn.grade
                }
        })) ;
    }, []);
},

fiddle

【讨论】:

  • 在小提琴中,一些对象有 txn: > 0 并显示 virtual: true,你打算写 virtual: !txn.grade 吗?
  • 是的,当然,我只是混淆了逻辑,因为我不知道您应用的业务逻辑,并且就问题而言并不重要。我只是用我在你的 sn-p 中看到的字段随机填充页面对象。我只提供了转换的骨架,而不是您可以在应用中复制和粘贴的真正算法
  • 这在这种特殊情况下不起作用,因为当页面为空时 virtual 设置为 true,换句话说,我们将 virtual 放在根本没有 txn 的页面中。
  • @BarryG 可以用真实数据的子集扩展您的问题,以便我们可以讨论确切的示例?到目前为止,我只找到并修复了计算结果索引txn 的一个不一致之处。在 OP 中,虚拟节点为 0
  • 我已经添加了数据架构。
猜你喜欢
  • 2012-12-29
  • 2018-12-06
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多