如何用JavaScript的map或reduce转换CloudWatch返回的嵌套对象数组?
用map/reduce重构CloudWatch日志格式转换代码
针对你从CloudWatch获取的嵌套数组,这里提供两种用map和reduce重构的方案,替代原有的forEach实现:
方案一:map + reduce(推荐)
外层用map遍历每个日志条目数组,内层用reduce构建目标格式的对象,逻辑清晰且无副作用:
const desiredResp = respCW.map(logEntry => { return logEntry.reduce((acc, curr) => { if (curr.field === '@timestamp') { // 若需保留原字符串格式,直接赋值 curr.value 即可 acc.timestamp = new Date(curr.value).getTime(); } else if (curr.field === '@message') { acc.message = curr.value; } // 自动忽略@ptr等无关字段 return acc; }, { timestamp: '', message: '' }); });
方案二:全reduce实现
如果偏好全程用reduce处理,也可以在外层用reduce累加结果数组:
const desiredResp = respCW.reduce((resultArr, logEntry) => { const formattedLog = logEntry.reduce((acc, curr) => { switch(curr.field) { case '@timestamp': acc.timestamp = new Date(curr.value).getTime(); break; case '@message': acc.message = curr.value; break; } return acc; }, { timestamp: '', message: '' }); resultArr.push(formattedLog); return resultArr; }, []);
重构优势
- 修复原代码中未声明全局
date变量的问题,所有变量均为局部作用域 map直接返回新数组,无需手动维护外部newResult变量,代码更简洁- 逻辑更紧凑,减少多层嵌套条件判断,可读性更强
内容的提问来源于stack exchange,提问作者IgorAlves
相关产品推荐
相关产品推荐

