如何在javascript

时间:2015-07-25 00:46:11

标签: javascript functional-programming

使用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": []
  }
]

1 个答案:

答案 0 :(得分:2)

@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

相关问题