首页 > 解决方案 > 用 ES 语法替换 for 循环

问题描述

我正在尝试用 ES 语法重写我的循环。我试图只替换一个循环,但它被调用了几次。如何使用 ES 语法返回单个值?输出应该是未定义的或单个值。

输入示例:

[{"events": [{"type": "Change", "field_name": "123"}], "created_at": "2017-07-01"}, 
{"events": [{"type": "Change", "field_name": "456"}], "created_at": "2017-08-01"},
{"events": [{"type": "Change", "field_name": "789"}], "created_at": "2017-09-01"}]

和功能:

function extractAuditEventDate(data, field, type) {
    console.log(data)
    for (var i = 0; i < data.length; i++) {
        const audit = data[i]

        // const event = audits.events.find(e => e.type === type && e.field_name === field)

        for (var j = 0; j < audit.events.length; j++) {
            const event = audit.events[j]

            if (event.type === type && event.field_name === field) {
                //console.log(audits.created_at)
                return audit.created_at
            }
        }
    }
}

如果我extractAuditEventDate将参数数据作为输入示例传递,“456”作为字段名,“更改”作为类型,我希望得到“2018-07-01”

标签: javascript

解决方案


找不到物品时处理案件的小替代方案:

const data = [{"events": [{"type": "Change", "field_name": "123"}], "created_at": "2017-07-01"}, 
              {"events": [{"type": "Change", "field_name": "456"}], "created_at": "2017-08-01"},
              {"events": [{"type": "Change", "field_name": "789"}], "created_at": "2017-09-01"}]

const extractAuditEventDate = (data, field, type) => ({...
  data.find(audit => audit.events.some(event => 
    event.type === type && event.field_name === field))}).created_at   

console.log( extractAuditEventDate(data, '123', 'Change') )
console.log( extractAuditEventDate(data, '123', 'change') )

由于开销,ES6 功能替代品应该比您的 ES 版本慢几倍。


更快、更易读的替代方法可以是for...of循环(IE 不支持):

const data = [{"events": [{"type": "Change", "field_name": "123"}], "created_at": "2017-07-01"}, 
              {"events": [{"type": "Change", "field_name": "456"}], "created_at": "2017-08-01"},
              {"events": [{"type": "Change", "field_name": "789"}], "created_at": "2017-09-01"}]

function extractAuditEventDate(data, field, type) {
  for (let audit of data)
    for (let event of audit.events)
      if (event.type === type && event.field_name === field)
        return audit.created_at
}

console.log( extractAuditEventDate(data, '123', 'Change') )
console.log( extractAuditEventDate(data, '123', 'change') )


推荐阅读